T1:昆特牌
wsm这题面这么迷呢。。。。
模拟细节好多过艹。。。。
幸好第五种只有俩点有一个还水(雾
注意判重和非法情况(哈戳戳的写了个map去映射操作序列跑的贼慢
【丑陋的代码】
#include<bits/stdc++.h>
using namespace std;
int n,w,ans=-0x3f3f3f3f,tot;
int use[10],que[10];
vector<int> zhanchang[7];
int tianqi[7];
string s1;
map<string,int> caozuo;
struct player{
struct c{
int type;//1:单位 2:天气 3:反天气 4:烧灼 5:号角
int pos;
int point;
string id;
}card[10];
}a,b;
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int chupai(int p,int now){
if(p==2){
if(b.card[now].type==1){
zhanchang[b.card[now].pos+3].push_back(b.card[now].point);
}
if(b.card[now].type==2){
tianqi[b.card[now].pos]=tianqi[b.card[now].pos+3]=1;
}
if(b.card[now].type==3){
for(int i=1;i<=3;++i)
tianqi[i]=tianqi[i+3]=0;
}
if(b.card[now].type==4){
int maxx=0;
for(int i=1;i<=6;++i){
if(tianqi[i]) continue;
for(int j=0;j<zhanchang[i].size();++j)
maxx=max(maxx,zhanchang[i][j]);
}
if(maxx){
for(int i=1;i<=6;++i){
if(tianqi[i]) continue;
for(int j=0;j<zhanchang[i].size();++j)
if(zhanchang[i][j]==maxx)
zhanchang[i][j]=0;
}
}
}
}
else{
if(a.card[que[now]].type==1){
s1=s1+a.card[que[now]].id;
zhanchang[a.card[que[now]].pos].push_back(a.card[que[now]].point);
}
if(a.card[que[now]].type==2){
s1=s1+a.card[que[now]].id;
tianqi[a.card[que[now]].pos]=tianqi[a.card[que[now]].pos+3]=1;
}
if(a.card[que[now]].type==3){
s1=s1+a.card[que[now]].id;
for(int i=1;i<=3;++i)
tianqi[i]=tianqi[i+3]=0;
}
if(a.card[que[now]].type==4){
s1=s1+a.card[que[now]].id;
int maxx=0;
for(int i=1;i<=6;++i){
if(tianqi[i]) continue;
for(int j=0;j<zhanchang[i].size();++j)
maxx=max(maxx,zhanchang[i][j]);
}
if(maxx){
for(int i=1;i<=6;++i){
if(tianqi[i]) continue;
for(int j=0;j<zhanchang[i].size();++j)
if(zhanchang[i][j]==maxx)
zhanchang[i][j]=0;
}
}
}
if(a.card[que[now]].type==5){
s1=s1+a.card[que[now]].id;
int flag=0;
for(int i=1;i<=6;++i){
if(!tianqi[i])
flag=1;
}
if(flag&&tianqi[a.card[que[now]].pos]){
return 0;
}
if(!flag) s1=s1+'0';
else{
char x='0'+a.card[que[now]].pos-1;
s1=s1+x;
}
for(int i=0;i<zhanchang[a.card[que[now]].pos].size();++i)
zhanchang[a.card[que[now]].pos][i]*=2;
}
}
return 1;
}
int calc(){
int pointa=0,pointb=0;
for(int i=1;i<=3;++i){
for(int j=0;j<zhanchang[i].size();++j){
if(zhanchang[i][j]){
if(tianqi[i])++pointa;
else pointa+=zhanchang[i][j];
}
}
for(int j=0;j<zhanchang[i+3].size();++j){
if(zhanchang[i+3][j]){
if(tianqi[i+3])++pointb;
else pointb+=zhanchang[i+3][j];
}
}
}
return pointa-pointb;
}
void moni(){
s1="";
for(int i=1;i<=6;++i)
zhanchang[i].clear(),tianqi[i]=0;
if(w){
for(int i=1;i<=n;++i){
// cout<<b.card[i].type<<' '<<b.card[i].point<<' '<<b.card[i].pos<<'\n';
chupai(2,i);
// cout<<a.card[que[i]].type<<' '<<a.card[que[i]].point<<' '<<a.card[que[i]].pos<<'\n';
if(!chupai(1,i))
return ;
}
}
else{
for(int i=1;i<=n;++i){
// cout<<a.card[que[i]].type<<' '<<a.card[que[i]].point<<' '<<a.card[que[i]].pos<<'\n';
if(!chupai(1,i)) return ;
// cout<<b.card[i].type<<' '<<b.card[i].point<<' '<<b.card[i].pos<<'\n';
chupai(2,i);
}
}
if(caozuo[s1]) return ;
caozuo[s1]=1;
int ans1=calc();
// cout<<ans1<<'\n';
if(ans==ans1) ++tot;
else if(ans<ans1) ans=ans1,tot=1;
}
void dfs(int now){
if(now==n+1){
moni();
// cout<<'\n';
return ;
}
for(int i=1;i<=n;++i){
if(!use[i]){
use[i]=1;
que[now]=i;
if(a.card[i].type==5){
for(int j=1;j<=6;++j){
a.card[i].pos=j;
char x='a'+j-1;
dfs(now+1);
}
use[i]=0;
continue;
}
dfs(now+1);
use[i]=0;
}
}
}
int main(){
w=Read(),n=Read();
char now='a';
for(int i=1;i<=n;++i){
b.card[i].type=Read();
if(b.card[i].type==1){
b.card[i].point=Read();
b.card[i].pos=Read()+1;
}
if(b.card[i].type==2) b.card[i].pos=Read()+1;
}
for(int i=1;i<=n;++i){
a.card[i].id=now;now++;
a.card[i].type=Read();
if(a.card[i].type==1){
a.card[i].point=Read();
a.card[i].pos=Read()+1;
}
if(a.card[i].type==2) a.card[i].pos=Read()+1;
}
dfs(1);
cout<<ans<<' '<<tot;
return 0;
}
T2:电梯
看着数据范围就知道能O(1)做。。。。
结果少想了特殊情况咕成10pts
【代码】
#include<bits/stdc++.h>
using namespace std;
int T,n,m,a,b,c;
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int main(){
T=Read();
while(T--){
n=Read(),m=Read(),a=Read(),b=Read(),c=Read();
c=c%(n-2)+2;
if(c==2&&m==1)puts("-1");
else cout<<(n-1)+(m+1)/2<<'\n';
}
}
T3:玩
抱着一颗想开1e18的线段树的心打了40pts暴力==
结果打着打着比赛结束了(%你害人不浅啊
正解二分左右端点所在块,开两颗线段树维护就好了
【代码】
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=5e5+5;
const LL Mod=1e8+7;
int n,c;
LL lastans;
struct Tree{
int l,r;
LL len,maxh;
}tr[N<<2];
LL Read(){
LL i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
#define lc (root<<1)
#define rc (root<<1|1)
void build(int root,int l,int r){
tr[root].l=l;
tr[root].r=r;
if(l==r){
tr[root].len=0ll;
return;
}
int mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void push_up(int root){
tr[root].len=tr[lc].len+tr[rc].len;
tr[root].maxh=max(tr[lc].maxh,tr[rc].maxh);
}
void update(int root,int k,LL len,int h){
if(tr[root].l==tr[root].r){
tr[root].len=len;
tr[root].maxh=h;
return ;
}
if(k<=tr[lc].r)
update(lc,k,len,h);
else
update(rc,k,len,h);
push_up(root);
}
LL query(int root,LL k,int type){
if(tr[root].l==tr[root].r){
if(type==0){
if(k==0)
return tr[root].l-1;
else
return tr[root].l;
}
else
return tr[root].l;
}
if(k>=tr[lc].len)
return query(rc,k-tr[lc].len,type);
else
return query(lc,k,type);
}
LL find(int root,int l,int r){
if(tr[root].l>=l&&tr[root].r<=r){
return tr[root].maxh;
}
LL res=0;
if(tr[lc].r>=l)
res=max(res,find(lc,l,r));
if(tr[rc].l<=r)
res=max(res,find(rc,l,r));
return res;
}
LL rel(LL x){
return (x*2333+lastans*666)%Mod+1;
}
int main(){
n=Read(),c=Read();
build(1,1,n);
int now=0;
for(int i=1;i<=n;++i){
int cz=Read();
if(cz==1){
LL len=Read();
LL h=Read();
if(c==1){
len=rel(len);
h=rel(h);
}
update(1,++now,len,h);
}
else{
if(cz==2){
int x=Read();
update(1,x,0,0);
}
else{
LL L=Read(),R=Read(),l,r;
l=query(1,L,0),r=query(1,R,1);
lastans=find(1,l,r);
cout<<lastans<<'\n';
}
}
}
return 0;
}