SDOI 2016 Round1 Day1
储能表
/*
引自zyz大佬的数学思想
*/
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif ll k;int T,p;
int calc(ll x,ll i,ll j){
if(i<j) swap(i,j);
x/=i;
x*=i;
j%=p;
ll l=max(0LL,x-k);
ll r=max(0LL,x+i-k);
ll ans=(l+r-);
if(!(ans&)){
ans=(ans>>)%p;
ans=(ans*((r-l)%p))%p;
}
else{
ans=ans%p;
ans=(ans*((r-l>>)%p))%p;
}
return ans*j%p;
}
int solve(ll n,ll m){
ll ans=;
for(ll i=1LL<<,x=;i;i>>=){
if(n&i){
for(ll j=1LL<<,y=;j;j>>=){
if(m&j){
ans+=calc(x^y,i,j);
ans%=p;
y+=j;
}
}
x+=i;
}
}
return ans;
}
int main(){
for(scanf("%d",&T);T--;){
ll n,m;
scanf(LL LL LL LL,&n,&m,&k,&p);
printf("%d\n",solve(n,m));
}
return ;
}
数字配对
/*
二分图-->费用流
*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
using namespace std;
typedef long long i64;
const int N=;
const int M=5e5+;
const i64 inf=10000000000000LL;
struct edge{int v,next;i64 cap,cost;}e[M];int tot=,head[N];
int n,m,S,T,q[N],prev[N];bool vis[N];
i64 a[N],b[N],c[N];
i64 answ,ansf,dis[N];
void add(int x,int y,i64 z,i64 cost){
e[++tot].v=y;e[tot].cap=z;e[tot].cost=cost;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].cap=;e[tot].cost=-cost;e[tot].next=head[y];head[y]=tot;
}
bool spfa(){
for(int i=S;i<=T;i++) vis[i]=,dis[i]=-inf;
unsigned short h=,t=;q[t]=S;dis[S]=;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(e[i].cap&&dis[e[i].v]<dis[x]+e[i].cost){
dis[e[i].v]=dis[x]+e[i].cost;
prev[e[i].v]=i;
if(!vis[e[i].v]){
vis[e[i].v]=;
//if(dis[e[i].v]>dis[x]){
// q[h--]=e[i].v;
//}
//else{
q[++t]=e[i].v;
//}
}
}
}
}
return answ+dis[T]>=;
}
void augment(){
i64 flow=inf;
if(dis[T]<) flow=answ/(-dis[T]);
for(int i=T;i!=S;i=e[prev[i]^].v){
flow=min(flow,e[prev[i]].cap);
}
for(int i=T;i!=S;i=e[prev[i]^].v){
e[prev[i]].cap-=flow;
e[prev[i]^].cap+=flow;
}
ansf+=flow;
answ+=flow*dis[T];
}
i64 fpow(i64 a,i64 p,i64 mod){
i64 res=;
for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
return res;
}
bool judge(i64 x){
if(x<) return ;
if(x==) return ;
if(x&^) return ;
i64 a,t;
for(int i=;i<=;i++){
a=rand()%M;
if(a>=x&&a%x==) continue;
t=fpow(a,x-,x);
if(t!=) return ;
}
return ;
}
int main(){
scanf("%d",&n);S=,T=n<<|;
for(int i=;i<=n;i++) scanf(LL,&a[i]);
for(int i=;i<=n;i++){
scanf(LL,&b[i]);
add(S,i,b[i],);
add(i+n,T,b[i],);
}
for(int i=;i<=n;i++) scanf(LL,&c[i]);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j) continue;
if(a[j]&&!(a[i]%a[j])&&judge(a[i]/a[j])){
add(i,j+n,inf,c[i]*c[j]);
}
if(a[i]&&!(a[j]%a[i])&&judge(a[j]/a[i])){
add(i,j+n,inf,c[i]*c[j]);
}
}
}
while(spfa()) augment();
printf(LL,ansf/);
return ;
}
游戏
/*
树链剖分+树上差分
*/
#include<cstdio>
#include<algorithm>
using namespace std; #define lc k<<1
#define rc k<<1|1
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif typedef long long ll;
const ll inf=123456789123456789LL;
const int N=1e5+;
struct line{ll a,b;};
struct edge{int v,w,next;}e[N<<];int tot,head[N];
struct sgt{
ll mn;
line a;
bool tag;
sgt(){mn=inf;tag=;}
}tr[N<<];
int n,m,fa[N],son[N],siz[N],pos[N],top[N],dep[N],q[N];
ll ans,dfn[N],dis[N];
void add(int x,int y,int z){
e[++tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].w=z;e[tot].next=head[y];head[y]=tot;
}
void bfs(){
int h=,t=;q[t]=;dep[]=;fa[]=;
while(h!=t){
int x=q[++h];
for(int i=head[x];i;i=e[i].next){
int v=e[i].v;
if(v!=fa[x]){
fa[v]=x;
dep[v]=dep[x]+;
dis[v]=dis[x]+e[i].w;
q[++t]=v;
}
}
}
for(int j=n;j;j--){
int x=q[j];siz[x]=;son[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v;
if(fa[v]==x){
siz[x]+=siz[v];
if(siz[son[x]]<siz[v]) son[x]=v;
}
}
}
int bfs_cnt=;
for(int j=;j<=n;j++){
int x=q[j];
if(!pos[x]){
for(int y=x;y;y=son[y]){
pos[y]=++bfs_cnt;
dfn[bfs_cnt]=dis[y];
top[y]=x;
}
}
}
}
int lca(int x,int y){
for(;top[x]!=top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
}
return dep[x]<dep[y]?x:y;
}
ll get(line a,ll x){
return a.a*x+a.b;
}
void change(int k,int l,int r,int opl,int opr,line a){
int mid=l+r>>;
if(opl<=l&&r<=opr){
tr[k].mn=min(tr[k].mn,min(get(a,dfn[l]),get(a,dfn[r])));
if(!tr[k].tag){
tr[k].tag=;tr[k].a=a;
return ;
}
if(l==r){
if(get(a,dfn[l])<get(tr[k].a,dfn[l]))tr[k].a=a;
return ;
}
bool b0=get(a,dfn[l])<get(tr[k].a,dfn[l]);
bool b1=get(a,dfn[mid])<get(tr[k].a,dfn[mid]);
bool b2=get(a,dfn[r])<get(tr[k].a,dfn[r]);
if(!b0&&!b2) return ;
if(b0&&b2){
tr[k].a=a;
return ;
}
if(b1){
swap(a,tr[k].a);
b0^=;b2^=;
}
if(b0) change(lc,l,mid,opl,opr,a);
if(b2) change(rc,mid+,r,opl,opr,a);
return ;
}
if(opl<=mid) change(lc,l,mid,opl,opr,a);
if(mid+<=opr) change(rc,mid+,r,opl,opr,a);
tr[k].mn=min(tr[k].mn,min(tr[lc].mn,tr[rc].mn));
}
void query(int k,int l,int r,int opl,int opr){
if(opl<=l&&r<=opr){
ans=min(ans,tr[k].mn);
return ;
}
if(tr[k].tag){
ans=min(ans,min(get(tr[k].a,dfn[max(l,opl)]),get(tr[k].a,dfn[min(r,opr)])));
}
int mid=l+r>>;
if(opl<=mid) query(lc,l,mid,opl,opr);
if(mid+<=opr) query(rc,mid+,r,opl,opr);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y,z;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
bfs();
for(int i=,opt,x,y,z;i<=m;i++){
scanf("%d",&opt);
if(opt&){
ll a,b;
scanf("%d%d",&x,&y);
scanf(LL LL ,&a,&b);
z=lca(x,y);
ll Ax=-a,Bx=a*dis[x]+b;
ll Ay=a,By=a*(-*dis[z]+dis[x])+b;
for(;dep[top[x]]>dep[z];x=fa[top[x]]){
change(,,n,pos[top[x]],pos[x],(line){Ax,Bx});
}
for(;dep[top[y]]>dep[z];y=fa[top[y]]){
change(,,n,pos[top[y]],pos[y],(line){Ay,By});
}
if(x!=z) change(,,n,pos[z],pos[x],(line){Ax,Bx});
else if(y!=z) change(,,n,pos[z],pos[y],(line){Ay,By});
else change(,,n,pos[z],pos[z],(line){Ax,Bx});
}
else{
scanf("%d%d",&x,&y);
ans=inf;
z=lca(x,y);
for(;dep[top[x]]>dep[z];x=fa[top[x]]){
query(,,n,pos[top[x]],pos[x]);
}
for(;dep[top[y]]>dep[z];y=fa[top[y]]){
query(,,n,pos[top[y]],pos[y]);
}
if(x!=z) query(,,n,pos[z],pos[x]);
else if(y!=z) query(,,n,pos[z],pos[y]);
else query(,,n,pos[z],pos[z]);
printf(LL "\n",ans);
}
}
return ;
}
SDOI 2016 Round1 Day1的更多相关文章
- 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏
考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- 【BZOJ 4598】【SDOI 2016 Round2 Day1 T3】模式字符串
2016-05-21因为BZOJ上“ 数据文件太过巨大,仅提供前三组数据测试.”所以我考场上写的60分的点分治交上去也A了. 我的这个点分治的时间复杂度是$O(Tnmlogn)$的,听题解时没听懂$O ...
- 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记
我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...
- 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途
比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...
- SDOI 2016 Round1 Day2
生成魔咒 /* 后缀数组+双向链表 参照:https://blog.csdn.net/clove_unique/article/details/53911757 */ #include<cstd ...
- SDOI 2019 Round1 游记
\(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...
- SDOI 2016 游戏
树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...
- SDOI 2016 数字配对
题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...
随机推荐
- selenium清空元素时,.clear不执行
应该是由于鼠标焦点没有定位到相应元素 driver.find_element_by_xpath('//input[@type="password"]').click() drive ...
- python里的“__all__ ”作用
转载:http://python-china.org/t/725 参考:http://www.cnblogs.com/alamZ/p/6943869.html 用 __all__ 暴露接口,这是一种约 ...
- python中pickle简介
2017-04-10 pickle是用来加工数据的,可以用来存取结构化数据. 例如: 一个字典a = {'name':'Timmy','age':26},用pickle.dump存到本地文件,所存数据 ...
- 用PHP上传文件时$_FILES中error返回值详解
用PHP上传文件时,我们会用程序去监听浏览器发送过来的文件信息,首先会通 过$_FILES[fieldName]['error']的不同数值来判断此欲上传的文件状态是否正常.$_FILES[field ...
- ant create-path 报不允许匹配[xX][mM][1L]错误
将build.xml配置文件的第一行 <?xml version="1.0" encoding="UTF-8"?> 空格去掉
- EffectiveJava(11)Java中的clone
java中的clone clone构造器及其静态工厂的变形 优点:它们不依赖于某一种很有风险的,语言之外的对象创建机制; 它们不要求遵守尚未制定好文档的规范 他们不会于final域的正常使用发生冲突 ...
- Visual Studio 2015 Update 1 安装到最后 KB3022398 错误解决方法
最后一步遇到一个错误的确让人心寒 只是我们还是得一步步解决.别去卸载重装.太费时 首先打开 regedit 注冊表,依次进入: 1:HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...
- 远程链接mysql数据库
mysql -P3306 -uroot -proot 显示最大连接数 show variables like '%max_connections%'; 设置最大链接数 ;//默认100--只对当前进程 ...
- python random 学习
随机产生8位数,每位数都是1~6之间数字 import random list_1 = [i for i in xrange(1,7)] print list_1 arr_1=[] for i in ...
- cache和buffer区别探讨
一. 1.Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的.它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用.比如生产者——消费者问题,他们产生和消耗资源的速度大体 ...