Submission #205728

#TimeUsernameProblemLanguageResultExecution timeMemory
205728mraronZvijezda (COCI19_zvijezda)C++14
110 / 110
683 ms8184 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pt;
#define xx first
#define yy second
int ccw(pt a, pt b, pt c) {
	b.xx-=a.xx;b.yy-=a.yy;
	c.xx-=a.xx;c.yy-=a.yy;
	
	/*if(b.yy*c.xx<c.yy*b.xx) return -1;
	else if(b.yy*c.xx>c.yy*b.xx) return 1;
	return 0;*/
	if(ld(b.yy)*ld(c.xx)>ld(c.yy)*ld(b.xx)) return -1;
	else if(ld(b.yy)*ld(c.xx)<ld(c.yy)*ld(b.xx)) return 1;
	return 0;
}
int n;
pt pts[1000001];

pair<pt,pt> side(int x) {
	x%=n;
	x+=n;
	return make_pair(pts[x%n], pts[(x+1)%n]);
}

int val(pair<pt,pt> sd, pt q) {
	return ccw(sd.xx,sd.yy,q)!=-1;
}

int main() {
	int t;
	cin>>t;
	cin>>n;
	for(int i=0;i<n;++i) cin>>pts[i].xx>>pts[i].yy;
	int q;
	cin>>q;
	ll x=0;
	while(q--) {
		//0,n-1
		//0,n/2-1
		pt Q;
		cin>>Q.xx>>Q.yy;

		Q.xx^=t*x*x*x;
		Q.yy^=t*x*x*x;
		auto r1=side(0), r2=side(n/2);
	/*	cerr<<r1.xx.xx<<" "<<r1.xx.yy<<" | "<<r1.yy.xx<<" "<<r1.yy.yy<<"r1\n"; 
		cerr<<r2.xx.xx<<" "<<r2.xx.yy<<" | "<<r2.yy.xx<<" "<<r2.yy.yy<<"r2\n"; 
		cerr<<val(r1,Q)<<" "<<val(r2,Q)<<"\n";
		for(int i=0;i<=n-1;++i) cerr<<val(side(i),Q)<<" ";
		cerr<<"\n";
		*/
		if(val(r1,Q)==1 && val(r2,Q)==1) {
			cout<<"DA\n";
			x++;
		}
		else if(val(r1,Q)==0 && val(r2,Q)==0) cout<<"NE\n";
		else {
			auto binker=[&](pair<pt,pt> sd, int v, int l, int r, int pos) {
				int L=pos;
				for(int j=18;j>=0;j--) {
					int akt=L-(1<<j);
					if(akt>=l) {
						if(val(side(akt),Q)==v) L=akt;
					}
				}
				int R=pos;
				for(int j=18;j>=0;j--) {
					int akt=R+(1<<j);
					if(akt<=r) {
						if(val(side(akt),Q)==v) R=akt;
					}
				}
				//cerr<<l<<" "<<L<<" "<<R<<" "<<r<<"cucc\n";
				return R-L+1;
			};
			int egyik=binker(r1, val(r1,Q), 0, n/2-1,0);
			int masik=binker(r2, val(r2,Q), n/2, n-1,n/2);
			int sum=0;
			if(val(r1,Q)==1) sum+=egyik; else sum+=n/2-egyik;
			if(val(r2,Q)==1) sum+=masik; else sum+=n/2-masik;
			//cerr<<egyik<<" "<<masik<<" "<<sum<<"\n";
			if(sum>n/2) {
				cout<<"DA\n";
				x++;
			}
			else cout<<"NE\n";
			
		}
		
	}	
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...