标签:特定 cup turn etc 位置 ack friend || false
#include<bits/stdc++.h>
#define inf 9999999
using namespace std;
inline int read()//快读
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
int n,m;
int tot=1;
struct node{
int v,c;
bool flag;
}edge[2010];
int nxt[2010];
int hd[1010];
inline void add_edge(int u,int v,int c)//前向星
{
edge[tot].v=v,edge[tot].c=c;
nxt[tot]=hd[u];
hd[u]=tot++;
}
struct node2{
int u,v,c,f;
}a[1010];
bool cmp(node2 a,node2 b)//将边按流量排序(实际没什么卵用)
{
return a.f<b.f;
}
struct node3{//Dijkstra专用堆+运算符重载
int pos,num;
friend bool operator < (node3 a,node3 b)
{
return a.num>b.num;
}
};
long double ans=0;
priority_queue<node3> q;
int dis[1010];
bool book[1010];
inline void init(int limit)//按照流量限制初始化并建图
{
tot=1;
memset(edge,0,sizeof(edge));
memset(nxt,0,sizeof(nxt));
memset(hd,0,sizeof(hd));
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++) dis[i]=(i==1)? 0:inf;
for(int i=1;i<=m;i++)
if(a[i].f>=limit)
{
add_edge(a[i].u,a[i].v,a[i].c);
add_edge(a[i].v,a[i].u,a[i].c);
}
}
void Dijkstra()//Dijkstra板子,不解释
{
q.push({1,0});
while(!q.empty())
{
int x=q.top().pos;
q.pop();
if(book[x]) continue;
book[x]=1;
for(int i=hd[x];i;i=nxt[i])
if(dis[edge[i].v]>dis[x]+edge[i].c)
{
dis[edge[i].v]=dis[x]+edge[i].c;
q.push({edge[i].v,dis[edge[i].v]});
}
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++) a[i].u=read(),a[i].v=read(),a[i].c=read(),a[i].f=read();
sort(a+1,a+m+1,cmp);
for(int i=1;i<=1000;i++)
{
init(i);
Dijkstra();
ans=max(ans,(long double)i/(long double)dis[n]);
}
ans*=(long double)1000000;
ans=floor(ans);
printf("%lld\n",(long long)ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline int read()//快读
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
int n,m;
int tot=1;
int edge[200010];
int nxt[200010];
int hd[100010];
inline void add_edge(int u,int v)//前向星
{
edge[tot]=v;
nxt[tot]=hd[u];
hd[u]=tot++;
}
int a[100010];
bool ans[100010];
//Segment_Tree
struct node{
int l,r;
bool num;
}f[100010*4];
inline void pushup(int p)
{
f[p].num=0;//注意这一步,否则节点有可能一直是true而在其子节点都被改为false后由于or的性质没有被改变
f[p].num|=f[p*2].num,f[p].num|=f[p*2+1].num;
}
void build(int p,int l,int r)//建树
{
f[p].l=l,f[p].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
bool query(int p,int l,int r)//查询
{
if(f[p].l>=l&&f[p].r<=r) return f[p].num;
int mid=(f[p].l+f[p].r)>>1;
bool ans=0;
if(l<=mid) ans|=query(p*2,l,r);
if(r>mid) ans|=query(p*2+1,l,r);
return ans;
}
void modify(int p,int x,bool y)//修改
{
if(f[p].l==f[p].r)
{
f[p].num=y;
return;
}
int mid=(f[p].l+f[p].r)>>1;
if(x<=mid) modify(p*2,x,y);
else modify(p*2+1,x,y);
pushup(p);
}
//树剖
int son[100010],rk[100010],id[100010],sz[100010],fa[100010],top[100010],d[100010];
void dfs1(int p,int f,int dep)//第一次深搜
{
fa[p]=f,d[p]=dep,sz[p]=1;
for(int i=hd[p];i;i=nxt[i])
{
if(edge[i]==f) continue;
dfs1(edge[i],p,dep+1);
sz[p]+=sz[edge[i]];
if(sz[edge[i]]>sz[son[p]]) son[p]=edge[i];
}
}
int cnt=0;
void dfs2(int p,int tp)//第二次深搜
{
id[p]=++cnt,rk[cnt]=p,top[p]=tp;
if(son[p]) dfs2(son[p],tp);
for(int i=hd[p];i;i=nxt[i])
{
if(edge[i]==fa[p]||edge[i]==son[p]) continue;
dfs2(edge[i],edge[i]);
}
}
bool query_LCA(int x,int y)//查询答案
{
bool ans=0;
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]]) swap(x,y);
ans|=query(1,id[top[x]],id[x]);
x=fa[top[x]];
}
ans|=query(1,min(id[x],id[y]),max(id[x],id[y]));
return ans;
}
vector<int> v1[100010];//储存每种牛在哪些位置
struct node2{
int a,b,id;
};
vector<node2> v2[100010];//储存查询每种牛的查询操作在哪个位置,方便最后储存答案
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read(),v1[a[i]].push_back(i);
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add_edge(u,v),add_edge(v,u);
}
dfs1(1,-1,1);
dfs2(1,1);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int a=read(),b=read(),c=read();
v2[c].push_back({a,b,i});
}
for(int i=1;i<=n;i++)
{
for(vector<int>::iterator it=v1[i].begin();it!=v1[i].end();it++) modify(1,id[*it],1);
for(vector<node2>::iterator it=v2[i].begin();it!=v2[i].end();it++) ans[it->id]=query_LCA(it->a,it->b);
for(vector<int>::iterator it=v1[i].begin();it!=v1[i].end();it++) modify(1,id[*it],0);
}
for(int i=1;i<=m;i++)
if(ans[i]) printf("1");
else printf("0");
printf("\n");
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
long long n;
long long a[]={-1,1,2,4,7,8,11,13};
int main()
{
cin>>n;
cout<<(n/8)*15+a[n%8]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
int n,l;
struct node{
int w,x,d;
}a[50010];
bool cmp(node x,node y)
{
return x.x<y.x;
}
struct node2{
int t,dir;
}b[50010];
bool cmp2(node2 x,node2 y)
{
return x.t<y.t;
}
int totw=0,t;
int f[50010];//树状数组板子
inline int lowbit(int x)
{
return x&(-x);
}
inline void modify(int x,int y)
{
for(;x<=n;x+=lowbit(x)) f[x]+=y;
}
inline int query(int x)
{
int ret=0;
for(;x;x-=lowbit(x)) ret+=f[x];
return ret;
}
struct node3{
int pos,id;
}c[50010];
bool cmp3(node3 x,node3 y)
{
if(x.pos!=y.pos) return x.pos<y.pos;
else return x.id>y.id;//注意:有可能有多头牛最后在同一个点,此时他们也算相遇,所以要加这一句
}
long long ans=0;
int main()
{
n=read(),l=read();
for(int i=1;i<=n;i++) a[i].w=read(),a[i].x=read(),a[i].d=read(),totw+=a[i].w;
sort(a+1,a+n+1,cmp);//按照数轴上的位置排序
for(int i=1;i<=n;i++)
if(a[i].d==1) b[i]={l-a[i].x,1};
else b[i]={a[i].x,-1};//按照“互相穿过”计算A序列
sort(b+1,b+n+1,cmp2);
int lp=1,rp=n,cnt=0;
for(int i=1;i<=n;i++)
{
if(b[i].dir==1) cnt+=a[rp--].w;
else cnt+=a[lp++].w;
t=b[i].t;
if(cnt>=(totw+1)/2) break;
}//计算时间t
for(int i=1;i<=n;i++)
if(a[i].d==1) c[i]={a[i].x+t,i};
else c[i]={a[i].x-t,i};//计算t秒后的位置
sort(c+1,c+n+1,cmp3);//排序
for(int i=n;i>=1;i--)
ans+=(long long)query(c[i].id-1),modify(c[i].id,1);//逆序对
printf("%lld\n",ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
int n,m;
int a[100010];
int tot=1;
int edge[200010];
int nxt[200010];
int hd[100010];
inline void add_edge(int u,int v)//前向星
{
edge[tot]=v;
nxt[tot]=hd[u];
hd[u]=tot++;
}
int d[100010];
struct node{
int pos;
bool val1,val2;
}LCA[100010][20];
queue<int> q;
bool book[100010];
int max_lg;
void prework()//LCA预处理
{
book[1]=1;
d[1]=1,q.push(1);
max_lg=log2(n)+1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=hd[x];i;i=nxt[i])
{
int y=edge[i];
if(book[y]) continue;
book[y]=1;
if(a[x]==0) LCA[y][0].val1=1;
else LCA[y][0].val2=1;
LCA[y][0].pos=x;
d[y]=d[x]+1;
for(int j=1;j<=max_lg;j++)
{
LCA[y][j].pos=LCA[LCA[y][j-1].pos][j-1].pos;//在维护LCA的同时维护val1和val2
LCA[y][j].val1|=LCA[LCA[y][j-1].pos][j-1].val1;
LCA[y][j].val1|=LCA[y][j-1].val1;
LCA[y][j].val2|=LCA[LCA[y][j-1].pos][j-1].val2;
LCA[y][j].val2|=LCA[y][j-1].val2;
}
q.push(y);
}
}
}
bool query(int x,int y,int type)//查询LCA的同时查询val1或val2
{
bool ans1=0,ans2=0;
if(a[x]==0) ans1=1;
else ans2=1;
if(a[y]==0) ans1=1;
else ans2=1;
if(d[x]<d[y]) swap(x,y);
for(int i=max_lg;i>=0;i--)
if(d[LCA[x][i].pos]>=d[y])
{
ans1|=LCA[x][i].val1,ans2|=LCA[x][i].val2;
x=LCA[x][i].pos;
}
if(x==y)
{
if(type==1) return ans1;
else return ans2;
}
for(int i=max_lg;i>=0;i--)
if(LCA[x][i].pos!=LCA[y][i].pos)
{
ans1|=LCA[x][i].val1,ans2|=LCA[x][i].val2;
x=LCA[x][i].pos;
ans1|=LCA[y][i].val1,ans2|=LCA[y][i].val2;
y=LCA[y][i].pos;
}
ans1|=LCA[x][0].val1,ans2|=LCA[x][0].val2;
ans1|=LCA[y][0].val1,ans2|=LCA[y][0].val2;
if(type==1) return ans1;
else return ans2;
}
int main()
{
n=read(),m=read();
string s;
cin>>s;
for(int i=0;i<s.length();i++)
if(s[i]=='H') a[i+1]=0;
else a[i+1]=1;
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
prework();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
char c;
cin>>c;
if(c=='H')
{
if(query(x,y,1)==0) printf("0");
else printf("1");
}
else
{
if(query(x,y,2)==0) printf("0");
else printf("1");
}
}
printf("\n");
return 0;
}
#include<bits/stdc++.h>
using namespace std;
inline int read()//快读
{
int ret=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return w*ret;
}
int n,k;
int a[25][25];
int ans=0;
int main()
{
k=read(),n=read();
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)//读入
{
int x=read();
a[i][x]=j;
}
for(int i=1;i<=n;i++)//枚举牛
for(int j=1;j<=n;j++)
if(i!=j)
{
for(int l=1;l<=k;l++)//检查是否可行
if(a[l][i]<a[l][j]) goto nxt;
ans++;
nxt:;
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
map<string,bool> mp;
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
{
for(int j=0;j+i-1<n;j++)
{
string tmp=s.substr(j,i);//取表示位置当前的子串
if(mp[tmp]) goto nxt;//若重复,则不可行,进入下一个k
mp[tmp]=1;//将子串标记为存在
}
cout<<i<<endl;//若没有冲突,则说明当前解可行,输出并返回
return 0;
nxt:;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10];
map<string,int> mp1;
map<int,string> mp2;
int b[8][2];
void check()
{
for(int i=1;i<=n;i++)//检查当前解是否可行
{
int x,y;
for(int j=1;j<=8;j++)
if(a[j]==b[i][0]) x=j;
else if(a[j]==b[i][1]) y=j;
if(abs(x-y)!=1) return;
}
for(int i=1;i<=8;i++) cout<<mp2[a[i]]<<endl;//若可行,直接输出并返回
exit(0);
}
int main()
{
mp1["Beatrice"]=1,mp2[1]="Beatrice";//正向+反向手动按字典序映射
mp1["Belinda"]=2,mp2[2]="Belinda";
mp1["Bella"]=3,mp2[3]="Bella";
mp1["Bessie"]=4,mp2[4]="Bessie";
mp1["Betsy"]=5,mp2[5]="Betsy";
mp1["Blue"]=6,mp2[6]="Blue";
mp1["Buttercup"]=7,mp2[7]="Buttercup";
mp1["Sue"]=8,mp2[8]="Sue";
cin>>n;
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
b[i][0]=mp1[s];
cin>>s,cin>>s,cin>>s,cin>>s;//这里连着那么多cin主要是为了处理中间的那堆废话
cin>>s;
b[i][1]=mp1[s];
}
for(int i=1;i<=8;i++) a[i]=i;
do{
check();//查询当前解是否可行
}while(next_permutation(a+1,a+9));//暴力枚举
return 0;
}
标签:特定 cup turn etc 位置 ack friend || false
原文地址:https://www.cnblogs.com/xiaoh105/p/12116583.html