目标周过题量为21,daily3!
今日是周总结开始的日子,希望能坚持下去。
周总结我其实很早之前就有打算,cx老师也多次劝我,但是一直缺少一个决心,有时候也不知道每天要写些什么。 借写题的机会,正好可以顺便总结,等一年后,回首观之,希望能惊艳到自己吧。
今天开始周总结。
下午校内训练 AC 2 (内部题目) 晚上补 1 模板题
晚上补了 CF 1187 F 期望题 我没有特判len[0]=1 1187完结!
打算开始进军BZOJ
###跟着黄学长的脚步###
/*
user: sky48
language: c++
for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 100005
#define M 305
typedef long long ll;
using namespace std;
int n,ans,top,a[M],a1,t1,t2,fa[M];
struct node {
int a,b,v;
}s[N];
int gets()
{
int v=0; char ch;bool f=0;
while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
return f?-v:v;
}
bool cmp(const node &x,const node &y){
return x.v<y.v;
}
int getfa(int x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
int main ()
{
n=gets();
rep(i,1,n)
a[i]=gets(), s[++top].a=0, s[top].b=i, s[top].v=a[i], fa[i]=i;
rep(i,1,n) rep(j,1,n){
a1=gets();
if(i<j) s[++top].a=i, s[top].b=j, s[top].v=a1;
}
sort(1+s,1+s+top,cmp);
rep(i,1,top){
t1=getfa(s[i].a), t2=getfa(s[i].b);
if(t1==t2) continue;
ans+=s[i].v; fa[t1]=t2;
}
cout<<ans<<endl;
return 0;
}
/*
user: sky48
language: c++
for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 100005
typedef long long ll;
using namespace std;
int n,m,a1,a[N],s[N*2],ans,flag,sum;
int gets()
{
int v=0; char ch;bool f=0;
while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
return f?-v:v;
}
int main ()
{
n=gets(); m=gets();
rep(i,1,n){
a1=gets();
if(a1>m) a[i]=1;
if(a1<m) a[i]=-1;
if(a1==m) a[i]=0;
}
s[n]++;
rep(i,1,n){
if(!a[i]) flag=1;
sum+=a[i];
if(flag) ans+=s[sum+n];
if(!flag) s[sum+n]++;
// cout<
}
cout<<ans<<endl;
return 0;
}
想到构造回路以后,感觉好像很水。结果一直被卡T,后面看了别人的博客,加了一些优化才卡进时间。据说本题用随机更快
1186 完结
/*
user: sky48
language: c++
for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 2000005
typedef long long ll;
using namespace std;
int tot=1,to[N*2],head[N],net[N*2],tic,q[N*2],top,n,m,a1,a2;
int du[N],flag[N],num,v[N*2],clc[N];
struct node {
int a,b;
}ans[N*2];
inline int gets()
{
int v=0; char ch;bool f=0;
while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
return f?-v:v;
}
inline void ins(int frm,int to2){
to[++tot]=to2, net[tot]=head[frm], head[frm]=tot;
to[++tot]=frm, net[tot]=head[to2], head[to2]=tot;
}
inline void dfs(int x){
clc[x]++; int tim=clc[x]; //别人博客的优化
flag[x]=1;
for(int t=head[x];t;t=net[t]) if(!v[t]) {
head[x]=net[t]; //别人博客的优化
v[t]=v[t^1]=1;
dfs(to[t]);
if(clc[x]>tim)break; //别人博客的优化
}
q[++top]=x;
}
int main ()
{
n=gets(), m=gets();
rep(i,1,m) a1=gets(), a2=gets(), ins(a1,a2), du[a1]++, du[a2]++;
rep(i,1,n)
if(du[i]&1) ins(0,i);
int t;
rep(i,1,n){
if(flag[i]) continue;
top=0;
dfs(i);
for(int j=1;j+1<=top;j+=2)
if(q[j]&&q[j+1]) //shi bian
ans[++num].a=q[j], ans[num].b=q[j+1];
for(int j=2;j+1<=top;j+=2){
t=j+2;
if(j+1==top) t=2;
if(!(q[j-1]&&q[j]&&q[j+1]&&q[t])&&q[j]&&q[j+1])
ans[++num].a=q[j], ans[num].b=q[j+1];
}//cout<
}
printf("%d\n",num);
rep(i,1,num)
cout<<ans[i].a<<" "<<ans[i].b<<endl;
return 0;
}
今天校内训练只写了两题。3人ak,人均3+
我B题想复杂了,使用单调队列调了2h,结果后面的水题都没有时间写 虽然也是假题
感觉后两天如果一不小心,明年大家就见不到我了。。/ll
/*
user: sky48
language: c++
for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 10005
typedef long long ll;
using namespace std;
int to[N*2],head[N],net[N*2],tot,flag[N],f[N],n,m,a1,a2,ans;
int gets()
{
int v=0; char ch;bool f=0;
while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
return f?-v:v;
}
void ins(int frm,int to2){
to[++tot]=to2, net[tot]=head[frm], head[frm]=tot;
// to[++tot]=frm, net[tot]=head[to2], head[to2]=tot;
}
int fin(int x){
for(int t=head[x];t;t=net[t]) if(!flag[to[t]]){
flag[to[t]]=1;
if(!f[to[t]]||fin(f[to[t]])){ f[to[t]]=x; return 1;}
}
return 0;
}
int main ()
{
n=gets(); m=gets();
rep(i,1,m){
a1=gets()+1, a2=gets()+1;
ins(i,a1); if(a1!=a2) ins(i,a2);
}
rep(i,1,n) f[i]=0;
rep(i,1,m){
rep(j,1,n) flag[j]=0;
if(fin(i)) ans++;
else break;
}
cout<<ans<<endl;
return 0;
}
CF 102220 - The 13th Chinese Northeast Collegiate Programming Contest
把每个点拆开连向一排新的点。
cf 102263 - ArabellaCPC 2019
斜线DP 考虑答案就是把所有弄成一棵树,树上的叶子个数。那就考虑什么时候叶子个数会+1,那就是这一条斜线上i点和i左下角的那个点的方向不一样,所以我们考虑,如果i是右,i左下角是下,那么叶子个数+1 。然后DP就由左下角转移即可。 代码是借鉴他人的,这么简洁的代码真是优秀呀。
/*
user: sky48
language: c++
for dream for young
*/
#include<iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define mod 1000000007
#define N 105
#define M 10005
typedef long long ll;
using namespace std;
int n,m,lim,t,f[2][M][3],x,y;
int gets()
{
int v=0; char ch;bool f=0;
while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
return f?-v:v;
}
int add(int x,int y){
if(x+y>mod) return x+y-mod;
return x+y;
}
int main ()
{
// freopen("tt.txt","r",stdin);
n=gets(); m=gets(); lim=gets();
if(lim>5000){ puts("0"); return 0;}
f[0][1][0]=1;
for(int o=n+m-1;o>=2;o--){
if(o<=n) x=o-1, y=1;
else x=n, y=o-n;
for(int now=0;x>=1&&y<=m;x--,y++,now++){
t^=1;
rep(k,1,lim){
if(now==0){
f[t][k][0]=add(f[t^1][k][0],f[t^1][k][1]);
f[t][k][1]=add(f[t^1][k][0],f[t^1][k][1]);
}
else {
f[t][k][0]=add(f[t^1][k][0],f[t^1][k][1]);
f[t][k][1]=add(f[t^1][k-1][0],f[t^1][k][1]);
}
if(x==n) f[t][k][1]=0;
if(y==m) f[t][k][0]=0;
// cout<
}
}
}
cout<<add(f[t][lim][0],f[t][lim][1])<<endl;
return 0;
}
二分图新的分法:该题和质因数有关,将质因数为奇数的放一侧,将质因数为偶数的放一侧。
SYSU-10 (Dhaka 2010)