济南day3
连续几天都有点炸
预计的分拿不到,调整好心态,考试的时候多想一下,think twice,code once
唉,什么情况啊
0+0+0
T1读错题输出反了
n*m%2判断是否==1
T2
40分暴力忘记取mod了,全炸了gg
T3
70分暴力输出了中间变量,然后主席树写成了区间第k小,gg
建立10颗线段树维护前k大,因为k<=10
总结:以后认真点.....多推一下样例,合理分配时间,多思考
做完之后检查,最后几分钟不调新程序
下午
我可能只能口头ac了,考完后都能说出正解,就是写不来,也许不吃饭就考不好????,我好菜啊
10+20+10
没状态,笔记本不好用,其实T2和T3是都可以切的,但是做了T1,虽然最后想出来了,没写不出来,不值。
T1 找环dfs瞎搞找错了,做了2h,后边没法做了
#include<cstdio> #include<vector> #include<cstring> using namespace std; const int maxn = 100086; struct node{ int v,next; }edge[maxn*4]; int head[maxn*4]; const int mod =1e9+7;int num; inline void add_edge(int u,int v) { edge[++num].v=v;edge[num].next=head[u];head[u]=num; } inline int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x*f; } bool vis[maxn*2]; int n,m;bool flag=0; int dfs(int u,int f) { int cnt=1; vis[u]=1; for(int i=head[u];i;i=edge[i].next) { int v=edge[i].v; if(v==f)continue; if(vis[v])flag=1; else cnt=(cnt+dfs(v,u))%mod; } return cnt%mod; } int rd[maxn]; int main () { n=read();m=read(); for(int i=1;i<=m;++i) { int a=read(),b=read(); add_edge(a,b);add_edge(b,a); } long long ans=1; for(int i=1;i<=n;++i) { if(!vis[i]){ flag=0; int qqq=dfs(i,0)%mod; if(!flag)ans=(ans%mod*qqq%mod)%mod; else ans=(ans<<1)%mod; } } printf("%lld\n",ans); }
T2 想出来了正解,没时间写了,暴力写炸
#include<cmath> #include<cstdio> #include<iostream> using namespace std; typedef long long LL; LL n,ans,cnt; LL a[66],k; int main() { // freopen("endless.in","r",stdin); // freopen("endless.out","w",stdout); cin>>n>>k; LL x=n; while(x) { a[++cnt]=x%k; x/=k; } if(cnt%2==0) ans=pow(k,cnt/2); else { for(int i=cnt;i>=1;i--) { if(a[i]>0&&i%2==0) { ans+=pow(k,i/2); break; } if(a[i]==0&&i%2) continue; ans+=a[i]*pow(k,i/2); if(i==1&&a[i]>0) ans++; } } cout<<ans<<endl; return 0; }
T3 想出来了正解,没写,暴力写炸
#include<algorithm> #include<cstring> #include<cstdio> using namespace std; #define maxn 200007 #define LL long long int n,K; int num=0; int val[maxn<<2],pos[maxn<<2],fa[maxn<<2]; int clo[maxn<<2],cle[maxn<<2],lason[maxn<<2],tot=0; struct node{ int v,next; }edge[maxn<<1]; int head[maxn<<1]; LL dis[maxn<<1],tree[maxn<<1],tag[maxn<<1],ans=0;//I64d见祖宗 void add_edge(int u,int v){ edge[++num].v=v;edge[num].next=head[u];head[u]=num; } void dfs(int rt) { clo[rt]=++tot;cle[tot]=rt; for(int i=head[rt];i;i=edge[i].next) { if(edge[i].v==fa[rt]) continue; fa[edge[i].v]=rt;dis[edge[i].v]=dis[rt]+(LL)val[edge[i].v]; dfs(edge[i].v); } lason[rt]=tot; } void merge(int l,int r,int rt) { tree[rt]=tree[rt<<1];pos[rt]=pos[rt<<1]; if(tree[rt] < tree[rt<<1|1]) tree[rt]=tree[rt<<1|1],pos[rt]=pos[rt<<1|1]; return ; } void pushdown(int rt) { if(!tag[rt]) return ; tag[rt<<1]+=tag[rt];tag[rt<<1|1]+=tag[rt]; tree[rt<<1]-=tag[rt];tree[rt<<1|1]-=tag[rt]; tag[rt]=0;return ; } void build(int l,int r,int rt) { if(l==r) { tree[rt]=dis[cle[r]]; pos[rt]=cle[r];return ; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); merge(l,r,rt); } void update(int l,int r,int rt,int ll,int rr,int c) { if(ll<=l&& r<=rr) { tree[rt]-=(LL)c;tag[rt]+=(LL)c;return ; } pushdown(rt); int mid=(l+r)>>1; if(ll<=mid) update(l,mid,rt<<1,ll,rr,c); if(rr>mid) update(mid+1,r,rt<<1|1,ll,rr,c); merge(l,r,rt); } int main() { //freopen("tour.in","r",stdin); //freopen("tour.out","w",stdout); int u,v,now; scanf("%d%d",&n,&K); for(int i=1;i<=n;i++) scanf("%d",val+i); for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add_edge(u,v),add_edge(v,u); dis[1]=val[1]; dfs(1); build(1,n,1); while(K--) { if(!tree[1]) break; ans+=tree[1];now=pos[1]; while(val[now]) { update(1,n,1,clo[now],lason[now],val[now]);val[now]=0;now=fa[now]; } } printf("%lld\n",ans); return 0; }