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的边 对于每 ...
随机推荐
- 转: 初识Agile/CMMI/Scrum
转:http://www.cnblogs.com/maxwell/p/5093917.html 一.背景介绍 在朋友(aehyok)的建议下,初步去了解Visual Studio Online,简称V ...
- resin后台输出中文乱码的解决办法!
resin后台输出中文乱码的解决办法! 学习了:https://blog.csdn.net/kobeguang/article/details/34116429 编辑conf/resin.con文件: ...
- 容量测试之tcpcopy引流模式
tcpcopy 给用户提供了很多命令参数来修改引流的模式和设置,详细可以查阅手册.在这里把几种常见的引流方式做个归纳小结,以tcpcopy传统架构使用命令举例. 1.分布式引流 用法:Tcpcopy可 ...
- http接口测试—自动化测试框架设计
转载:https://my.oschina.net/hellotest/blog/499719 一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值(Js ...
- 排查 “Detected Tx Unit Hang”问题
实现功能: 使用自己已经分配的内存让skb->data指向,而不是使用alloc_malloc(). 部分代码如下: /* * build a new sk_buff */ //struct s ...
- Jsp:useBean使用详解
<jsp:useBean>标签用来在jsp页面中创建一个Bean实例,定义语法如下: 一.<jsp:useBean>语法 <jsp:useBean id="id ...
- react 打包后,项目部署完毕,刷新页面报错(404)
原因解析: 之所以你在浏览器内可以由首页跳转到其他路由地址,是因为这是由前端自行渲染的,你在React Router定义了对应的路由,脚本并没有刷新网页访问后台,是JS动态更改了location. 当 ...
- epoll使用详解(精髓)(转)
epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是 ...
- 【BIEE】02_新建资料库并创建简单分析
一.新建资料库 1.开始→打开BI管理→点击新建资料库 2.文件→新建资料档案库 下一步 在下面的框中一次填入 连接类型:OCI 10g/11g(直接选择即可) 数据库名称:(DESCRIPTION ...
- 如何从一个1G的文件中找到你所需要的东西
如何从一个1G的文件中找到你所需要的东西,这个问题貌似面试的时候会经常问到.不过不论你用什么语言,肯定逃脱不了按指针读或者按块读. 这里介绍python的用法.本人亲自实验了,速度还可以. 如果你的文 ...