#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define aa first
#define bb second
const int maxx=4e7+8;
const int nn=100005;
char IN[maxx],*ipos;
#define read() (strtol(ipos,&ipos,10))
pii s[nn];
int n,m;
int p,q,top;
int main ()
{
fread(IN,maxx,1,stdin);ipos=IN;
n=read(),m=read();
for(int i=1;i<=m;++i)
{
p=read(),q=read();
if(!p)
{
while(top&&s[top].aa==0)
{
q=max(s[top--].bb,q);
}
while(top>=2&&s[top-1].bb<=q)
{
top-=2;
}
s[++top]=make_pair(0,q);
}
else if(top) {
while(top&&s[top].aa==1)
{
q=min(s[top--].bb,q);
}
while(top>=2&&s[top-1].bb>=q)
{
top-=2;
}
s[++top]=make_pair(1,q);
}
}
int l=1,r=n;
int k=n;
int res[nn];
for(int i=1;i<=top;++i)
{
if(s[i].aa==0)
{
while(l<=r&&r>s[i].bb)
{
res[r--]=k--;
}
}
else {
while(l<=r&&l<s[i].bb)
{
res[l++]=k--;
}
}
if(l>r)
break;
}
if(top%2)
{
while(l<=r)
{
res[l++]=k--;
}
}
else {
while(l<=r)
{
res[r--]=k--;
}
}
for(int i=1;i<=n;++i)
printf("%d ",res[i]);
return 0;
}
异或博弈(举例
#include <iostream>
#include <cmath>
using namespace std;
int main ()
{
int t,n;
cin>>t;
int sum=0,x,f;
int a[200005],cnt,cnt1;
while(t--)
{
sum=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum^=a[i];
}
if(sum==0)
{
cout<<0<<"\n";
}
else {
cnt=0;
while(sum)
{
sum>>=1;
cnt++;
}
cnt=pow(2,cnt-1);
cnt1=0;
for(int i=1;i<=n;++i)
{
if(a[i]&cnt)
{
cnt1++;
}
}
if(cnt1>1)
{
if(n%2)
{
cout<<1<<"\n";
}
else cout<<-1<<"\n";
}//暴力跑一些小数据,验证 或者写个暴力程序
else {
cout<<1<<"\n";
}
}
}
}
暴力set直线
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
const double eps=1e-8;
typedef long long ll;
typedef pair<double,double> pii;
#define aa first
#define bb second
const int maxx=4e7+8;
const int nn=100005;
char IN[maxx],*ipos;
#define read() (strtol(ipos,&ipos,10))
int n,m;
int p,q,top;
pii s[200000];
bool cmp(pii a,pii b)
{
if(a.aa==b.aa)
return a.bb<b.bb;
return a.aa<b.aa;
}
int main ()
{
fread(IN,maxx,1,stdin);ipos=IN;
int cnt=0;
int n=19;
for(double x=0;x<=n;++x)
{
for(double y=0;y<=n+1;++y)
{
for(double i=0;i<=n;++i)
{
if(i==x)
continue;
for(double j=0;j<=n+1;++j)
{
s[++cnt]=make_pair((j-y)/(i-x),y-x*((j-y)/(i-x)));
}
}
}
}
sort(s+1,s+cnt+1);//注意第一个
cout<<cnt<<endl;
int ans=n+2;
for(int i=2;i<=cnt;++i)
{
if(abs(s[i].aa-s[i-1].aa)<=eps&&abs(s[i].bb-s[i-1].bb)<=eps)
{
continue;
}
else ans++;
}
cout<<ans;
return 0;
}