T1 【NOIP2013模拟联考8】最短路(path)
Solution
设s为第0个标记点,t为k+1个跑k+1次最短路
然后全排列暴力求解qwq
注意最大值要设为long long范围最大值
Code
PS:各种修改qwq
//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=50010,M=100010;
int cnt;
int head[N],to[M],w[M],nxt[M],poi[20],dis[20][N],vis[N];
priority_queue<PII,vector<PII>,greater<PII> > Q;
void dij(int s) {
Q.push(PII(dis[s][poi[s]]=0,poi[s]));
memset(vis,0,sizeof vis);
while(!Q.empty()) {
int u=Q.top().second; Q.pop();
if(vis[u]) continue;
E(i,u) {
int v=to[i];
if(dis[s][v]>dis[s][u]+w[i]) Q.push(PII(dis[s][v]=dis[s][u]+w[i],v));
}
vis[u]=1;
}
}
int ans=3000000000ll;
bool fla[20];
void dfs(int num,int sum,int fr,int k) {
if(sum>ans) return ;
if(num==k) {ans=min(ans,sum+dis[fr][poi[k]]);return ;}
F(i,1,k-1) if(!fla[i]) fla[i]=1,dfs(num+1,sum+dis[fr][poi[i]],i,k),fla[i]=0;
}
#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,w[cnt]=c,head[a]=cnt
signed main() {
// freopen("path10.in","r",stdin);
int n=read(),m=read(),k=read(),s=read(),t=read(),x,y,z;
F(i,1,m) {
x=read(),y=read(),z=read();
add(x,y,z);
}
poi[0]=s;
F(i,1,k) poi[i]=read();
poi[++k]=t;
F(i,0,k-1) F(j,1,n) dis[i][j]=3000000000ll;
F(i,0,k-1) dij(i);
// F(i,0,k) F(j,0,k) printf("dis[%d][%d]=%d
",i,poi[j],dis[i][poi[j]]);
dfs(1,0,0,k);
if(ans==3000000000ll) printf("-1");
else printf("%lld",ans);
return 0;
}
T2 【NOIP2013模拟联考11】剑与魔法(dragons)
Solution
贪心,保留范围内最大的值,最后注意把剩下的都加上
Code
//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=200010;
char p[N];
int da[N],ans;
priority_queue<int,vector<int>,greater<int> > Q;
int main() {
int n=read();
F(i,1,n) scanf("
"),p[i]=getchar(),da[i]=read();
// F(i,1,n) cout<<p[i]<<" ";
int tot=0;
F(i,1,n) if(p[i]!='e') tot++;
if(tot<da[n]) {
printf("-1");
return 0;
}
F(i,1,n-1) {
if(p[i]=='c') Q.push(da[i]);
else {
while(Q.size()>da[i]-1) {
if(Q.empty()) {
printf("-1");
return 0;
}
Q.pop();
}
}
}
while(!Q.empty()) ans+=Q.top(),Q.pop();
printf("%d",ans);
return 0;
}
T3 【NOIP2013模拟联考13】三角形(triangle)
Solution
枚举一个点,算出另外n-1个点关于它的斜率并统计答案
Code
//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=3010;
int xi[N],yi[N];
double k[N];
signed main() {
freopen("triangle.in","r",stdin);
freopen("triangle.out","w",stdout);
int n=read(),ans=n*(n-1)*(n-2)/6;
F(i,1,n) xi[i]=read(),yi[i]=read();
F(i,1,n) {
int tot=0,reg=1;
F(j,i+1,n) if(yi[i]!=yi[j]&&xi[i]!=xi[j]) k[++tot]=(double)(yi[j]-yi[i])/(xi[j]-xi[i]);
sort(k+1,k+1+tot);
// F(j,1,tot) cout<<k[j]<<" ";cout<<endl;
F(j,2,tot) {
if(k[j-1]==k[j]) reg++;
if(k[j-1]!=k[j]||j==tot) ans-=reg*(reg-1)/2,reg=1;
}
reg=0;
F(j,i+1,n) if(i!=j&&xi[i]==xi[j]) reg++;
ans-=reg*(reg-1)/2;reg=0;
F(j,i+1,n) if(i!=j&&yi[i]==yi[j]) reg++;
ans-=reg*(reg-1)/2;reg=0;
}
printf("%lld",ans);
return 0;
}