Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
// Micha� Figlus
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
#include<list>
#include<algorithm>
using namespace std;
void update(int k,int x,int *t)
{
t[x]=k;
while(x>1)
{
x/=2;
t[x]=max(t[2*x],t[2*x+1]);
}
}
int maximum(int p,int q,int *t)
{
int wynik=-2000000000;
while(p<=q)
{
if(wynik<t[p]) wynik=t[p];
if(wynik<t[q]) wynik=t[q];
if(p%2==1) p++;
if(q%2==0) q--;
p/=2;
q/=2;
}
return wynik;
}
int main()
{
int i,j,n,z,w,x1,x2,y1,y2,*p,q,*a,*h;
bool b;
scanf("%d",&z);
for(j=1;j<=z;j++)
{
scanf("%d%d",&n,&w);
vector<pair<int,int> > t;
vector<pair<int,int> > v;
a = new int [n+1];
h = new int [n+1];
q=1;
b=true;
while(q<2*n) q*=2;
p = new int [q+1];
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
t.push_back(make_pair(min(x1,x2),i));
h[i]=abs(y2-y1);
}
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
v.push_back(make_pair(min(x1,x2),i));
}
sort(t.begin(),t.end());
sort(v.begin(),v.end());
for(i=0;i<n;i++)
{
a[t[i].second]=i;
p[q/2+i]=h[t[i].second];
}
for(i=q/2+n;i<q;i++) p[i]=0;
for(i=q/2-1;i>0;i--) p[i]=max(p[2*i],p[2*i+1]);
for(i=0;i<n&&b;i++)
{
if(a[v[i].second]!=i&&maximum(q/2,q/2+a[v[i].second]-1,p)+h[v[i].second]>w) b=false;
else update(0,q/2+a[v[i].second],p);
}
if(b) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | // Micha� Figlus #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<iostream> #include<fstream> #include<vector> #include<queue> #include<stack> #include<list> #include<algorithm> using namespace std; void update(int k,int x,int *t) { t[x]=k; while(x>1) { x/=2; t[x]=max(t[2*x],t[2*x+1]); } } int maximum(int p,int q,int *t) { int wynik=-2000000000; while(p<=q) { if(wynik<t[p]) wynik=t[p]; if(wynik<t[q]) wynik=t[q]; if(p%2==1) p++; if(q%2==0) q--; p/=2; q/=2; } return wynik; } int main() { int i,j,n,z,w,x1,x2,y1,y2,*p,q,*a,*h; bool b; scanf("%d",&z); for(j=1;j<=z;j++) { scanf("%d%d",&n,&w); vector<pair<int,int> > t; vector<pair<int,int> > v; a = new int [n+1]; h = new int [n+1]; q=1; b=true; while(q<2*n) q*=2; p = new int [q+1]; for(i=1;i<=n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); t.push_back(make_pair(min(x1,x2),i)); h[i]=abs(y2-y1); } for(i=1;i<=n;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); v.push_back(make_pair(min(x1,x2),i)); } sort(t.begin(),t.end()); sort(v.begin(),v.end()); for(i=0;i<n;i++) { a[t[i].second]=i; p[q/2+i]=h[t[i].second]; } for(i=q/2+n;i<q;i++) p[i]=0; for(i=q/2-1;i>0;i--) p[i]=max(p[2*i],p[2*i+1]); for(i=0;i<n&&b;i++) { if(a[v[i].second]!=i&&maximum(q/2,q/2+a[v[i].second]-1,p)+h[v[i].second]>w) b=false; else update(0,q/2+a[v[i].second],p); } if(b) printf("TAK\n"); else printf("NIE\n"); } return 0; } |
English