本来打算划划水洗洗睡了,突然听到这次的主人公是冈部伦太郎
石头门(《steins;gate》)主题的比赛,岂有不打之理!
石头门真的很棒啊!人设也好剧情也赞曲子也特别好听。
推荐http://music.163.com/#/m/song?id=26259014&userid=115264555
(强行跑题)
O(n^4)暴力妥妥的
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int read(){ 9 int x=0,f=1;char ch=getchar();10 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}11 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}12 return x*f;13 }14 vector r[51],c[51];15 int mp[51][51];16 int check(int a,int x,int y){17 for(int i=0;i
枚举 扫描
发现枚举横坐标最多需要枚举1e7次
推一下收益的式子就可以了。
1 #include2 #include 3 #include 4 #include 5 #include 6 #define LL long long 7 using namespace std; 8 int read(){ 9 int x=0,f=1;char ch=getchar();10 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}11 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}12 return x*f;13 }14 LL calc(LL x,LL y){15 LL res=(1+y)*y/2*(x+1);16 res+=(1+x)*x/2*y;17 res+=(1+x)*x/2;18 return res;19 }20 LL ans=0;21 int main(){22 int i,j;23 int m,b;24 m=read();b=read();25 for(int i=0;i>=0;i++){26 int y=b-ceil((double)i/m);27 if(y<0)break;28 ans=max(ans,calc(i,y));29 }30 printf("%I64d\n",ans);31 return 0;32 }
贪心 构造
显然当不能满足要求的出栈序的时候就要把栈内元素排序。
真的都排序的话复杂度受不了,只存还没有排过序的就可以了
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int mxn=300050; 9 int read(){10 int x=0,f=1;char ch=getchar();11 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}12 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}13 return x*f;14 }15 priority_queue q;16 int last,ord;17 int n,x;18 char s[10];19 int st[mxn],top=0;20 int main(){21 int i,j;22 n=read();23 int ed=n<<1;24 ord=1;25 int ans=0;26 for(i=1;i<=ed;i++){27 // printf("i:%d\n",i);28 scanf("%s",s);29 if(s[0]=='a'){30 scanf("%d",&x);31 q.push(-x);32 st[++top]=x;33 last=x;34 }35 else{ //remove36 if(last==ord){37 q.pop();38 ord++;39 if(top)top--;40 if(top){41 last=st[top];42 }43 else last=-q.top();44 }45 else{46 ans++;47 ord++;48 q.pop();49 last=-q.top();50 top=0;51 }52 }53 // printf("top:%d last:%d\n",q.top(),last);54 }55 printf("%d\n",ans);56 return 0;57 }
图论 最短路 脑洞题
正解是把每行每列看做一个点,在这些点和原有的点之间花式连边跑最短路。
然而博主用非显式建边的方法暴力跑了一发过去了。
只要有1w个点全在一行的数据就能把我的方法卡掉。。
↑然而没有这种数据233
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include
代码看着长,其实只要写一小段,其他都是复制的
数学问题 递推 矩阵乘法
应该跟D换一下的,明显这个更简单
看到矩阵乘法就能明白了吧233
1 #include2 #include 3 #include 4 #include 5 #include 6 #define LL long long 7 using namespace std; 8 const int mod=1e9+7; 9 LL read(){10 LL x=0,f=1;char ch=getchar();11 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}12 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}13 return x*f;14 }15 int sz=0;16 struct Mat{17 int x[16][16];18 void clear(){19 memset(x,0,sizeof x);return;20 }21 void init(int n){22 for(int i=0;i<=n;i++)x[i][i]=1;return;23 }24 Mat operator * (const Mat b){25 Mat res;26 for(int i=0;i<=sz;i++){27 for(int j=0;j<=sz;j++){28 res.x[i][j]=0;29 for(int k=0;k<=sz;k++){30 res.x[i][j]=((LL)res.x[i][j]+(LL)x[i][k]*b.x[k][j]%mod)%mod;31 }32 }33 }34 return res;35 }36 void debug(){37 for(int i=0;i<=sz;i++){38 for(int j=0;j<=sz;j++){39 printf("%d ",x[i][j]);40 }41 puts("");42 }43 puts("");44 return;45 }46 };47 Mat ans,bas,aa;48 Mat ksm(Mat a,LL k){49 Mat res;res.clear();res.init(sz);50 while(k){51 if(k&1)res=res*a;52 a=a*a;53 k>>=1;54 }55 return res;56 }57 int n;LL K;58 void Build(int lim){59 bas.clear();60 for(int i=0;i<=lim;i++){61 bas.x[i][i]=1;62 if(i)bas.x[i][i-1]=1;63 if(i =K)break;76 Build(c);77 b=min(b,K);78 aa=ksm(bas,b-a);79 ans=ans*aa;80 }81 printf("%d\n",ans.x[0][0]);82 return 0;83 }