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的边 对于每 ...
随机推荐
- wildfly配置PostgreSQL数据源
wildfly配置PostgreSQL数据源 很久以前写过在JBoss AS7上如何配置PostgreSQL数据源,此方法在wildfly上依然有效.不过,通过wildfly的命令行工具可以有更简单的 ...
- C#实现在Form上截取消息的两种方法
比较常用的是重载Form的DefWndProc方法,例如截取鼠标按下的消息: protected override void DefWndProc(ref Message m) { if ( m.Ms ...
- 机器学习第2课:单变量线性回归(Linear Regression with One Variable)
2.1 模型表示 之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示: 我们将要用来描述这个回归问题的标记如下: m 代表训练集中实 ...
- [转载]JAVA调用Shell脚本
FROM:http://blog.csdn.net/jj12345jj198999/article/details/11891701 在实际项目中,JAVA有时候需要调用C写出来的东西,除了JNI以外 ...
- VB断点调试
最近都在敲机房收费系统,这个系统是我们第一次自己在没有源代码的情况下进行的系统. 写程序的时候逻辑非常重要,可是我们还要清楚非常多时候你以为的并非你以为的! 就像在敲机房的时候,我们明明理清了逻辑.并 ...
- HTML 5 音频Audio
在HTML5标准网页里面,我们能够运用audio标签来完毕我们对声音的调用及播放. 下面是最常常见到的运用HTML5三种基本格式: 1.最少的代码 <audio src="song.o ...
- HTML基础知识总结一
一.HTML是什么? HTML是超文本标记语言的英文缩写,"超文本"就是指页面内能够包括图片.链接.甚至音乐.程序等非文字元素.超文本标记语言的结构包括"头"部 ...
- int a[3];中a+1与&a+1差别 -- C
int a[3]; a 和 &a 的地址一样的. a+1 == a + 1*sizeof(int);跳跃是一个数组元素大小 &a+1 == a + 3*sizeof(int);跳跃是整 ...
- 【Lucene】Apache Lucene全文检索引擎架构之构建索引2
上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...
- ios7中的edgesForExtendedLayout
edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向. 因为iOS7鼓励全屏布局,所以它的默认值是UIRectEdgeAll——四周边缘都延 ...