行列式

序列

#include<iostream>
#include<cstdio>
#define maxn 500010
using namespace std;
int n,m,mod,l,r,x,y,b[maxn],a[maxn],cnt;
void dfs(int now[],int sz){
if(sz<=){
for(int i=;i<=sz;i++)b[++cnt]=now[i];
return;
}
int sz1=,sz2=;
int d[sz],c[sz];
for(int i=;i<=sz;i++){
if(i%!=){//奇数位
c[++sz1]=now[i];
}
if(i%==){//偶数位
d[++sz2]=now[i];
}
}
dfs(c,sz1);
dfs(d,sz2);
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);
scanf("%d%d%d",&n,&m,&mod);
for(int i=;i<=n;i++)a[i]=i;
dfs(a,n);
long long ans;
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&l,&r,&x,&y);
ans=;
if(x>y)swap(x,y);
for(int j=l;j<=r;j++){
if(b[j]<=y&&b[j]>=x){
ans=(ans+b[j])%mod;
}
}printf("%I64d\n",ans);
}
fclose(stdin);fclose(stdout);
return ;
}

30分 暴力

/*
考虑类似线段树的求解方法,记 getans(n,l,r,x,y) 表示当前在 F 中,是 1 到 n 的升序
排列,需要求得最终排好序后 l 到 r 范围内,大小在 x 到 y 之间的数值之和以及数字个数
(getans 返回一个 pair) ,思考如何分治。
注意到左右分裂的规律,可以算出此时序列需要向左边和右边分出多少,同时可以知道
l,r,x,y 四个数在子区间的大小,分治下去求解。在回溯时,将左右子树答案合并即可。
注意如果实现过程中会有类平方运算,可能会超 Long Long 范围,需要特别注意处理。
具体实现详见代码,复杂度为 O(M logN)。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
using namespace std;
struct node{
long long a,b;
};
long long n,m,mod,l,r,u,v;
node make_node(long long x,long long y){
node w;
w.a=x;w.b=y;
return w;
}
node solve(long long rr,long long l,long long r,long long x,long long y){
if(x>rr||l>r)return make_node(,);
if(l==&&r==rr){
x=max(x,1LL);
y=min(y,rr);
long long s;
if((x+y)%==)s=((x+y)/)%mod*((y-x+)%mod)%mod;
else s=((x+y)%mod)*((y-x+)/%mod)%mod;
return make_node(s%mod,y-x+);
}
long long mid=(rr+)/;
if(r<=mid){
node res=solve(mid,l,r,x/+,(y+)/);
return make_node((res.a*-res.b)%mod,res.b);
}
else if(l>mid){
node res=solve(rr-mid,l-mid,r-mid,(x+)/,y/);
return make_node(res.a*%mod,res.b);
}
else{
node res1=solve(mid,l,mid,x/+,(y+)/);
node res2=solve(rr-mid,,r-mid,(x+)/,y/);
return make_node((res1.a*-res1.b+res2.a*)%mod,(res1.b+res2.b)%mod);
}
}
int main(){
freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf(LL LL LL,&n,&m,&mod);
for(int i=;i<m;i++){
scanf(LL LL LL LL,&l,&r,&u,&v);
node ans=solve(n,l,r,u,v);
printf(LL"\n",(ans.a+mod)%mod);
}
return ;
}

100分

数数(倍增)

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 100010
using namespace std;
int num,head[maxn];
int sz[maxn],son[maxn],fa[maxn],top[maxn],dep[maxn];
long long ans;
struct node{
int to,pre;
}e[maxn*];
int n,dis[][];
bool vis[maxn];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
void Bfs(int s){
queue<int>q;
memset(vis,,sizeof(vis));
vis[s]=;q.push(s);dis[s][s]=;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(vis[to])continue;
else {
dis[s][to]=dis[s][now]+;
vis[to]=;
q.push(to);
}
}
}
}
int count(int x){
int res=;
while(x){
res+=x&;
x>>=;
}
return res;
}
void dfs1(int now,int father){
dep[now]=dep[father]+;
sz[now]=;fa[now]=father;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==father)continue;
dfs1(to,now);
sz[now]+=sz[to];
if(!son[now]||sz[son[now]]<sz[to])son[now]=to;
}
}
void dfs2(int now,int father){
top[now]=father;
if(son[now])dfs2(son[now],father);
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==fa[now]||to==son[now])continue;
dfs2(to,to);
}
}
int LCA(int a,int b){
while(top[a]!=top[b]){
if(dep[top[a]]<dep[top[b]])swap(a,b);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
return a;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("bitcount.in","r",stdin);freopen("bitcount.out","w",stdout);
scanf("%d",&n);
int x,y;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
Insert(x,y);Insert(y,x);
}
for(int i=;i<=n;i++)Bfs(i);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=count(dis[i][j]);
dfs1(,);
dfs2(,);
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int lca=LCA(i,j);
ans+=dis[i][lca]+dis[j][lca];
}
}
cout<<ans;
fclose(stdin);fclose(stdout);
return ;
}

60分 暴力

/*
记 l(i,j) 表示 i 号节点向上 2^j 步的祖先节点。
记 f(i,j) 表示到 i 号节点,上一步长为 2^j 的数位之和。
记 g(i,j) 表示到 i 号节点,上一步长为 2^j 的方案数。
考虑转移方程:
g(i,j) → g(l(i,k),k),k < j
f(i,j) + g(i,j) → f(l(i,k),k),k < j
由于难以查询某一节点子树中深度为 d 的节点,该方程用自下而上更新的方法比较方便。
而 Ans 也很难用一个简洁的式子表示出,故在模拟向上跳跃的时候同步更新。
具体细节详见代码,复杂度 O(N log^2 N)。
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <vector> #define st first
#define nd second
using namespace std; struct edge {
int x;
int nxt;
};
typedef long long LL; const int N = 1E5 + ;
edge e[ * N];
int lca[N][], hd[N], fa[N], sons[N], nxt[N], cnt[N][], f[N][];
int n, m, x, y, l;
LL ans; void link(int x, int y) {
e[++l].x = y;
e[l].nxt = hd[x];
hd[x] = l;
} void dfs_lca(int x) {
lca[x][] = fa[x];
sons[x] = ;
for (int i = ; i <= ; ++i)
lca[x][i] = lca[lca[x][i - ]][i - ];
for (int p = hd[x]; p; p = e[p].nxt)
if (e[p].x != fa[x]) {
fa[e[p].x] = x;
dfs_lca(e[p].x);
sons[x] += sons[e[p].x];
}
} void dfs_ans(int x) {
for (int p = hd[x]; p; p = e[p].nxt)
if (e[p].x != fa[x]) nxt[x] = e[p].x, dfs_ans(e[p].x);
for (int i = ; i <= ; ++i) {
ans += sons[lca[x][i]] - sons[nxt[lca[x][i]]];
cnt[lca[x][i]][i]++;
f[lca[x][i]][i]++;
}
for (int i = ; i <= ; ++i)
for (int j = ; j <= i - ; ++j) {
ans += LL(cnt[x][i] + f[x][i]) * LL(sons[lca[x][j]] - sons[nxt[lca[x][j]]]);
cnt[lca[x][j]][j] += cnt[x][i];
f[lca[x][j]][j] += f[x][i] + cnt[x][i];
}
} int main() {
freopen("bitcount.in", "r", stdin);
freopen("bitcount.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i < n; ++i) {
scanf("%d%d", &x, &y);
link(x, y);
link(y, x);
}
dfs_lca();
sons[] = sons[];
nxt[] = ;
dfs_ans();
printf("%I64d\n", ans);
}

100分 倍增

2017-10-5 清北刷题冲刺班a.m的更多相关文章

  1. 2017-10-4 清北刷题冲刺班p.m

    P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...

  2. 2017-10-4 清北刷题冲刺班a.m

    P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...

  3. 2017-10-3 清北刷题冲刺班p.m

    a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...

  4. 2017-10-3 清北刷题冲刺班a.m

    P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...

  5. 2017-10-2 清北刷题冲刺班a.m

    一道图论神题 (god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...

  6. 2017-10-2 清北刷题冲刺班p.m

    最大值 (max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...

  7. 2017-10-1 清北刷题冲刺班p.m

    一道图论好题 (graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...

  8. 2017-10-7 清北刷题冲刺班p.m

    测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...

  9. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

  10. 2017-10-1 清北刷题冲刺班a.m

    位运算1 (bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...

随机推荐

  1. JS中的forEach、$.each、map方法推荐

    下面小编就为大家带来一篇JS中的forEach.$.each.map方法推荐.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 orEach是ECMA5中Array新方法中最 ...

  2. 本地windows安装memcached服务

    1.安装到系统服务中: 在doc中:执行此软件 memcached.exe -d install(如果提示错误,要找到cmd.exe用管理员身份打开) 安装后在,服务里吗就有个服务了,如果没有启动,点 ...

  3. Debian for ARM install python 3.5.x

    /********************************************************************************** * Debian for ARM ...

  4. BurpSuite工具应用及重放攻击实验

    一.BurpSuite工具介绍 BurpSuite是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HT ...

  5. linux命令学习(8):mv命令

    版权声明更新:2017-05-12博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  6. 白话算法(6) 散列表(Hash Table)从理论到实用(中)

    不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...

  7. 关于Snoop的用法

    snoop是开发wpf应用程序的利器.用它可以观察WPF的可视树,监听事件,更改元素属性等. 下面我介绍下snoop一些用法. 1.获取指定应用程序的UI   打开snoop,选择"Drag ...

  8. Puppet master nginx 扩展提升性能(puppet自动化系列4)

    puppet使用SSL(https)协议来进行通讯,默认情况下,puppet server端使用基于Ruby的WEBRick HTTP服务器.由于WEBRick HTTP服务器在处理agent端的性能 ...

  9. ubantu在登录界面一致循环的问题

    1.进入非图形化界面:在登录界面同时按下ctrl+alt+f1(有的需要同时按下ctrl+alt+f1+fn) 2.:输入你的账户名回车     *注意;这里是帐户名,而不是密码 3.:输入你的密码回 ...

  10. Java标签引起的陷阱

    请看下面的代码,请问下面的代码是否能够通过编译: package com.yonyou.test; /** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */ public ...