【NOIP模拟8.8】
来源:互联网 发布:sql select as语句 编辑:程序博客网 时间:2024/06/08 08:21
T1 expedition
离散化后记录每一种士兵的出现次数计算即可
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define LL long longusing namespace std;LL n,a[100010],b[100010],c[100010];LL cnt[100010],ans;int main(){ freopen("expedition.in","r",stdin); freopen("expedition.out","w",stdout); scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]),c[i]=b[i]; sort(c+1,c+n+1); int m=unique(c+1,c+n+1)-c-1; for(int i=1;i<=n;i++) b[i]=lower_bound(c+1,c+m+1,b[i])-c,cnt[b[i]]+=a[i]; for(int i=1;i<=n;i++) ans+=cnt[b[i]]*cnt[b[i]],cnt[b[i]]=0; printf("%lld",ans); return 0;}
T2 simplify
相当于一个多项式的中缀表达式求值,一个数组其实就可以用来表示一个多项式,数组的每一项是多项式每一项的系数,所以只需要手动模拟一下多项式加法,减法,乘法,递归计算的复杂度
PS:拉格朗日插值法可以做到
//by sdfzchy#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=1010,mod=10007;char s[1010];int len,optop,top,op[1010];struct info{ int len,a[501]; info(){len=0,memset(a,0,sizeof(a));} void reset(){while(len&&!a[len]) len--;}}stack[1010];info operator + (info a,info b){ info c; c.len=max(a.len,b.len); for(int i=0;i<=c.len;i++) c.a[i]=a.a[i]+b.a[i]; c.reset(); return c; }info operator - (info a,info b){ info c; c.len=max(a.len,b.len); for(int i=0;i<=c.len;i++) c.a[i]=a.a[i]-b.a[i]; c.reset(); return c;}info operator * (info a,info b){ info c; c.len=a.len+b.len; for(int i=0;i<=a.len;i++) for(int j=0;j<=b.len;j++) (c.a[i+j]+=a.a[i]*b.a[j])%=mod; c.reset(); return c; }int prio(char a){ if(a=='+'||a=='-') return 1; if(a=='*') return 2; if(a=='(') return 0;}void calc(){ if(op[optop]=='+') stack[top-1]=stack[top-1]+stack[top]; else if(op[optop]=='-') stack[top-1]=stack[top-1]-stack[top]; else if(op[optop]=='*') stack[top-1]=stack[top-1]*stack[top]; optop--;top--;}void pause(){return;}int main(){ freopen("simplify.in","r",stdin); freopen("simplify.out","w",stdout); scanf("%s",s+1); len=strlen(s+1); for(int i=1;i<=len;i++) { if(s[i]=='(') op[++optop]='('; else if(s[i]==')') { pause(); while(op[optop]!='(') calc(); optop--; } else if(s[i]=='x') { info a; a.a[1]=1; a.len=1; memset(stack[top+1].a,0,sizeof(stack[top+1].a)); stack[++top]=a; } else if(s[i]>='0'&&s[i]<='9') { info a; int x=0; while(s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0'; i--; a.a[0]=x; memset(stack[top+1].a,0,sizeof(stack[top+1].a)); stack[++top]=a; } else if(s[i]=='+'||s[i]=='-') { if(i==1||(s[i-1]=='(')) { int flag=(s[i++]=='+')?1:(-1); if(s[i]=='x') { info a; a.a[1]=flag; a.len=1; memset(stack[top+1].a,0,sizeof(stack[top+1].a)); stack[++top]=a; } if(s[i]>='0'&&s[i]<='9') { info a; int x=0; while(s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0'; i--; a.a[0]=x*flag; memset(stack[top+1].a,0,sizeof(stack[top+1].a)); stack[++top]=a; } } else { while(prio(s[i])<=prio(op[optop])) calc(); op[++optop]=s[i]; } } else if(s[i]=='*') { while(prio(s[i])<=prio(op[optop])) calc(); op[++optop]=s[i]; } } while(optop) calc(); cout<<stack[1].len<<endl; for(int i=0;i<=stack[1].len;i++) cout<<(stack[1].a[i]%mod+mod)%mod<<endl; return 0;}
T3 production
正反向各建一次图跑SPFA即可
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define LL long longusing namespace std;const int N=3010;const int M=100010;int head[N],ecnt,eecnt,hhead[N],n,m,dis[N],ddis[N],q;bool vis[N];struct edge{ int to,nxt,dis;}e[M],ee[M];void add_edge(int u,int v,int w){ e[++ecnt].nxt=head[u]; e[ecnt].to=v; e[ecnt].dis=w; head[u]=ecnt; ee[++eecnt].nxt=hhead[v]; ee[eecnt].to=u; ee[eecnt].dis=w; hhead[v]=eecnt;}void SPFA(){ int v,u; queue<int> q; q.push(1); dis[1]=0; vis[1]=1; while(!q.empty()) { u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].nxt) { v=e[i].to; if(dis[u]+e[i].dis<dis[v]) { dis[v]=dis[u]+e[i].dis; if(!vis[v]) { q.push(v); vis[v]=1; } } } }}void SSPFA(){ int v,u; queue<int> q; q.push(1); ddis[1]=0; vis[1]=1; while(!q.empty()) { u=q.front(); q.pop(); vis[u]=0; for(int i=hhead[u];i;i=ee[i].nxt) { v=ee[i].to; if(ddis[u]+ee[i].dis<ddis[v]) { ddis[v]=ddis[u]+ee[i].dis; if(!vis[v]) { q.push(v); vis[v]=1; } } } }}int main(){ freopen("production.in","r",stdin); freopen("production.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); } memset(dis,0x3f,sizeof(dis)); memset(ddis,0x3f,sizeof(ddis)); SPFA(); SSPFA(); scanf("%d",&q);// for(int i=1;i<=n;i++) cout<<dis[i]<<" "<<ddis[i]<<endl; for(int i=1,u,v;i<=q;i++) { scanf("%d%d",&u,&v); int tmp=ddis[u]+dis[v]; if(tmp>=1061109567) printf("-1\n"); else printf("%d\n",tmp); } return 0;}
PS:一套水题…
阅读全文
0 0
- 【NOIP模拟8.8】
- Noip模拟
- 【NOIP模拟】20151004模拟
- 【NOIP模拟】 20151005模拟
- 【NOIP模拟】 20151006模拟
- 【NOIP模拟】 20151007模拟
- 【NOIP模拟】20151014模拟
- 【NOIP模拟】20151015模拟
- 【09 NOIP 模拟】light
- [NOIP模拟]Day1
- 8.9CH NOIP模拟
- 8.10FCH NOIP模拟
- 8.13NOIP模拟
- 8.14NOIP模拟
- noip模拟赛 双城记
- Noip模拟总结
- 【noip模拟赛】密码
- [模拟][NOIP 2013]花匠
- CSU 1785 又一道简单题
- CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景
- spring(七)AOP,事务的隔离级别、传播特性、配置
- matlab double 转 integer 方法
- 交叉编译器的命名规则
- 【NOIP模拟8.8】
- (SCU
- requestAnimationFrame--用法及轮播动画
- NYOJ-0002-括号匹配
- CodeForces
- [POJ
- centos使用nginx搭建https服务器
- 文件编程----------write和复制操作
- 剑指offer——12.数值的整数次方