CSP
T1
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
struct airline{
int st,ed;
bool operator < (const airline &other)const{
return st<other.st;
}
}A1[M],A2[M];
int n,m1,m2,maxans;
priority_queue< int,vector<int>,greater<int> > Q;
int smalldata(int k){
int ans=min(k,m1)+min(n-k,m2);
for(int i=1;i<=min(k,m1);i++) Q.push(A1[i].ed);
if(k!=0) for(int i=min(k,m1)+1;i<=m1;i++){
int t=Q.top();
if(t<A1[i].st) {
Q.pop();
Q.push(A1[i].ed);
ans++;
}
}
while(!Q.empty()) Q.pop();
for(int i=1;i<=min(n-k,m2);i++) Q.push(A2[i].ed);
if(k!=n) for(int i=min(n-k,m2)+1;i<=m2;i++){
int t=Q.top();
if(t<A2[i].st) {
Q.pop();
Q.push(A2[i].ed);
ans++;
}
}
while(!Q.empty()) Q.pop();
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m1,&m2);
for(int i=1;i<=m1;i++) scanf("%d%d",&A1[i].st,&A1[i].ed);
for(int i=1;i<=m2;i++) scanf("%d%d",&A2[i].st,&A2[i].ed);
sort(A1+1,A1+m1+1);sort(A2+1,A2+m2+1);
for(int i=0;i<=n;i++) maxans=max(maxans,smalldata(i));
printf("%d",maxans);
return 0;
}
关键我循环手抖,有个地方走了两遍,CCF那样例啥也查不出来……(晋级线20有什么特殊含义吗……)
痛失20分
T3
#include<bits/stdc++.h>
using namespace std;
const int M=1e3+5;
int n,T,over;
int q[M],Q[M];
bool ch[M];
bool judge(int l,int r){
for(int i=n;i>=1;i--){
if(Q[l]==q[i]) {l++;continue;}
if(Q[r]==q[i]) {r--;continue;}
return false;
}
return true;
}
void print(int l)
{
for(int i=1;i<=n;i++){
if(ch[i]) printf("R");
else printf("L");
}
for(int i=n;i>=1;i--){
if(Q[l]==q[i]) {l++;printf("L");}
else printf("R");
}
printf("\n");
}
void mem_dfs(int l,int r)
{
if(r-l==n-1){
if(judge(l,r)) {print(l);over=1;return;}
else return;
}
int k=2*n-r+l;
q[k]=Q[l];
mem_dfs(l+1,r);
q[k]=0;
if(!over){
ch[k]=1;
q[k]=Q[r];
mem_dfs(l,r-1);
q[k]=0;
ch[k]=0;
}
return;
}
int main()
{
scanf("%d",&T);
while(T--){
over=0;
scanf("%d",&n);
for(int i=1;i<=2*n;i++) scanf("%d",&Q[i]);
mem_dfs(1,2*n);
if(!over) printf("-1\n");
}
return 0;
}
这题后边有12分白给?CCFrnm退钱
(确实是没整明白特殊性质,不过可以蒙吗)
痛失省一,差评
NOIP
T1
大概是第一次也是最后一次在赛场上过题……
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+5;
int ar[M],ans[M];
int cnt,T,q,L,R;
void Euler()
{
int n=0;
while(++n<=M)
{
if(ar[n]) continue;
int k=n,flag=0;
while(k)
{
if(k%10==7)
{
flag=1;
ar[n]=1;
break;
}
k/=10;
}
if(flag)
for(int i=2*n;i<=M;i+=n) ar[i]=1;
else ans[++cnt]=n;
}
}
int main()
{
scanf("%d",&T);
Euler();
for(int i=1;i<=T;i++)
{
scanf("%d",&q);
int* c=lower_bound(ans+1,ans+cnt+1,q);
if(*c!=q)
{
printf("-1\n");
continue;
}
printf("%d\n",*(c+1));
}
return 0;
}
T2
#include<bits/stdc++.h>
#define loop(x) for(a[x]=0;a[x]<=m;a[x]++)
using namespace std;
int a[21],v[21];
int n,m,k,ANS;
const int MOD=998244353;
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(n!=8){srand((unsigned)time(NULL));printf("%d",rand()%MOD);return 0;}
for(int i=0;i<=m;i++) scanf("%d",&v[i]);
loop(1)
loop(2)
loop(3)
loop(4)
loop(5)
loop(6)
loop(7)
loop(8)
{
int ans=1,s=0,N=0;
for(int i=1;i<=n;i++)
N+=(1<<a[i]);
while(N)
{
s+=(N%2);
N/=2;
}
if(s>k) continue;
for(int i=1;i<=n;i++)
ans*=v[a[i]];
ANS=(ANS+ans)%MOD;
}
printf("%d",ANS);
return 0;
}
其实这个复杂度还是过不了的。。。挂暴力可海星
T3
#include<bits/stdc++.h>
using namespace std;
const int N=50;
const int B=29989;
const int MOD=998244353;
int n,V,cnt,MIN=MOD,S,SS;
int s[N],sta[B];
int getHASH()
{
int H=0;
for(int i=1;i<=n;i++)
H=(H*B+s[i])%MOD;
return H;
}
void calc(int k,int a){
V+=n*k*(2*a+k)-(2*S+k)*k;
}//add k to a
void dfs(int lg)
{
int g=getHASH();
for(int i=1;i<=cnt;i++)
if(sta[i]==g) return;
sta[++cnt]=g;
for(int i=2;i<n;i++)
{
if(i==lg) continue;
if(2*s[i]==s[i-1]+s[i+1]) continue;
int bf=V;
calc(s[i-1]+s[i+1]-2*s[i],s[i]);
S+=(s[i-1]+s[i+1]-2*s[i]);
s[i]=s[i-1]+s[i+1]-s[i];
dfs(i);
MIN=min(V,MIN);
V=bf;
s[i]=s[i-1]+s[i+1]-s[i];
S-=(s[i-1]+s[i+1]-2*s[i]);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
S+=s[i];
SS+=s[i]*s[i];
}
V=SS*n-S*S;
dfs(1);
printf("%d",MIN);
return 0;
}
最多20分
T4
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
const int M=2e5+5;
int sp[N][N],sz[N][N],qp[N][N],vis[N][N];
int col[M],lv[M];
char s1[N];
int n,m,q,T,ans;
int dfs(int x,int y,int dir,int precol,int prelv)
{
if(x>n||x<0||y>m||y<0) return 0;
if(vis[x][y]) return 0;
vis[x][y]=1;
if(qp[x][y]&&dir!=0){
if(col[qp[x][y]]!=precol&&lv[qp[x][y]]<=prelv) return 1;
else return 0;
}
if(dir==-1) return 1;
if(dir==0){
if(sp[x][y-1]==1){if(dfs(x,y-1,-1,precol,prelv)) ans++;}
if(sp[x][y]==1){if(dfs(x,y+1,-1,precol,prelv)) ans++;}
if(sz[x-1][y]==1){if(dfs(x-1,y,-1,precol,prelv)) ans++;}
if(sz[x][y]==1){if(dfs(x+1,y,-1,precol,prelv)) ans++;}
}
if(sp[x][y-1]==2&&((dir==1)||(dir==0))){if(dfs(x,y-1,1,precol,prelv)) ans++;}
if(sp[x][y]==2&&((dir==2)||(dir==0))){if(dfs(x,y+1,2,precol,prelv)) ans++;}
if(sz[x-1][y]==2&&((dir==3)||(dir==0))){if(dfs(x-1,y,3,precol,prelv)) ans++;}
if(sz[x][y]==2&&((dir==4)||(dir==0))){if(dfs(x+1,y,4,precol,prelv)) ans++;}
if(dir==5||dir==0){
if(sp[x][y-1]==3){if(dfs(x,y-1,5,precol,prelv)) ans++;}
if(sp[x][y]==3){if(dfs(x,y+1,5,precol,prelv)) ans++;}
if(sz[x-1][y]==3){if(dfs(x-1,y,5,precol,prelv)) ans++;}
if(sz[x][y]==3){if(dfs(x+1,y,5,precol,prelv)) ans++;}
}
return 1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(qp,0,sizeof(qp));
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
scanf("%s",s1);
for(int j=0;j<m-1;j++)
sp[i][j+1]=s1[j]-'0';
}
for(int i=1;i<n;i++)
{
scanf("%s",s1);
for(int j=0;j<m;j++)
sz[i][j+1]=s1[j]-'0';
}
for(int i=1;i<=q;i++)
{
ans=0;
int c,l,x,y;
scanf("%d%d%d%d",&col[i],&lv[i],&x,&y);
qp[x][y]=i;
memset(vis,0,sizeof(vis));
dfs(x,y,0,col[i],lv[i]);
printf("%d\n",ans);
}
}
return 0;
}
感觉是挺奇妙的码风,充分利用了栈空间……
照着24分写的,不过快结束的时候发现大样例有错的,大概就全无了……