TJOI2015终于写完啦~~~

T1:[TJOI2015]旅游

描述:(BZ没题面只能口述了。。)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然后每次经过一个点该点的物品价格会上涨v,求每次贸易的最大获利

很裸的一道树链剖分,就是题目描述太不明白了。。这样就是在某条路径上找到某个点减去后面路径的最小点的值的最大值。可以用线段树的区间合并解决。就是在求答案时的合并答案上方向搞反了查了很久。。。以前也犯过着种错误,以后不能再犯了。。

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 50010
vector<int> e[maxn];
#define pb push_back
int add[maxn],pre[maxn],fa[maxn],pos[maxn];
int n;
inline void bfs() {
static int q[maxn],s[maxn],ch[maxn];
q[]=;
for (int l=,r=,u=q[l];l<=r;u=q[++l])
for (int i=;i<e[u].size();i++)
if (e[u][i]!=fa[u]) {
fa[e[u][i]]=u;
q[++r]=e[u][i];
}
for (int i=n,u=q[n];i;u=q[--i]) {
s[u]++;
s[fa[u]]+=s[u];
ch[fa[u]]=s[ch[fa[u]]]<s[u]?u:ch[fa[u]];
}
int cnt=;
for (int i=,u=q[];i<=n;u=q[++i]) {
if (add[u]!=) continue;
pos[add[u]=++cnt]=u;pre[u]=u;
for (u=ch[u];u;u=ch[u]) {
pos[add[u]=++cnt]=u;pre[u]=pre[fa[u]];
}
}
}
typedef long long ll;
struct b {
ll mx,mn,ans[];
b() {mx=mn=ans[]=ans[]=;}
};
inline b update(b l,b r) {
b ans;
ans.mx=max(l.mx,r.mx);
ans.mn=min(l.mn,r.mn);
ans.ans[]=max(max(l.ans[],r.ans[]),l.mx-r.mn);
ans.ans[]=max(max(l.ans[],r.ans[]),r.mx-l.mn);
return ans;
}
inline b rec(b x) {
swap(x.ans[],x.ans[]);
return x;
}
struct node {
int l,r,lz;b bo;
}t[maxn*];
#define lc (x<<1)
#define rc (lc^1)
#define mid ((l+r)>>1)
int a[maxn];
void build(int x,int l,int r){
t[x].l=l,t[x].r=r;
if (l==r) {
t[x].bo.mx=t[x].bo.mn=a[pos[l]];
t[x].bo.ans[]=t[x].bo.ans[]=;
return ;
}
build(lc,l,mid);build(rc,mid+,r);
t[x].bo=update(t[lc].bo,t[rc].bo);
}
inline void pb(int x) {
if (t[x].lz==) return ;
if (t[x].l!=t[x].r) {
t[lc].lz+=t[x].lz;
t[lc].bo.mn+=t[x].lz;
t[lc].bo.mx+=t[x].lz;
t[rc].lz+=t[x].lz;
t[rc].bo.mn+=t[x].lz;
t[rc].bo.mx+=t[x].lz;
}
t[x].lz=;
}
inline b change(int x,int x1,int y1,int z) {
int l=t[x].l,r=t[x].r;
pb(x);
if (x1<=l&&r<=y1) {
t[x].lz+=z;
t[x].bo.mn+=z;
t[x].bo.mx+=z;
return t[x].bo;
}
b ans;
if (mid>=y1) ans=change(lc,x1,y1,z);
else if (mid<x1) ans=change(rc,x1,y1,z);
else ans=update(change(lc,x1,y1,z),change(rc,x1,y1,z));
t[x].bo=update(t[lc].bo,t[rc].bo);
return ans;
}
inline b set(int x,int y,int z) {
int c[]={x,y};
b ans[];
bool bo[]={,};
while (c[]!=c[]) {
int l=add[c[]]<add[c[]]?:;
if (pre[c[l]]==pre[c[l^]]) {
if (bo[l]) ans[l]=update(change(,add[c[l^]]+,add[c[l]],z),ans[l]);
else ans[l]=change(,add[c[l^]]+,add[c[l]],z);
c[l]=c[l^];
} else {
if (bo[l]) ans[l]=update(change(,add[pre[c[l]]],add[c[l]],z),ans[l]);
else ans[l]=change(,add[pre[c[l]]],add[c[l]],z);
c[l]=fa[pre[c[l]]];
}
bo[l]=;
}
b _ans=change(,add[c[]],add[c[]],z);
if (bo[]) _ans=update(rec(ans[]),_ans);
if (bo[]) _ans=update(_ans,ans[]);
return _ans;
}
int main(){
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",a+i);
for (int i=;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
e[x].pb(y);e[y].pb(x);
}
bfs();
build(,,n);
int Q;
scanf("%d",&Q);
while (Q--) {
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
b ans=set(x,y,v);
printf("%d\n",ans.ans[],ans.ans[],ans.mx,ans.mn);
}
return ;
}

T2:[TJOI2015]棋盘

就是一道状态压缩+矩阵乘法。

首先我们可以先状压一下,可以发现每次的转移都是相同的,然后就能用矩阵乘法优化了

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned int uint;
struct mat{
uint t[][];
mat(){memset(t,,sizeof(t));}
}d,I;
int m,n,p,k,w,a[][];
mat operator *(mat x,mat y) {
mat ans;
for (int i=;i<m;i++)
for (int j=;j<m;j++)
for (int k=;k<m;k++)
ans.t[i][j]+=x.t[i][k]*y.t[k][j];
return ans;
}
mat operator ^ (mat x,int y) {
mat ans=I;
for (;y;y>>=) {
if (y&) ans=ans*x;
x=x*x;
}
return ans;
}
inline bool check(int x,int y){
static bool b[][];
memset(b,,sizeof(b));
for (int i=;i<w;i++) b[][i]=x&(<<i);
for (int i=;i<w;i++) b[][i]=y&(<<i);
for (int i=;i<;i++)
for (int j=;j<w;j++) {
if (!b[i][j]) continue;
for (int u=;u<;u++)
for (int v=;v<p;v++)
if (a[u][v]&&(u!=||v!=k)) {
int x=i+u-,y=j+v-k;
if (x>=&&x<&&y>=&&y<w&&b[x][y]) return ;
}
}
return ;
}
int main(){
freopen("chessboard.in","r",stdin);
freopen("chessboard.out","w",stdout);
scanf("%d%d%d%d",&n,&w,&p,&k);
for (int i=;i<;i++)
for (int j=;j<p;j++) scanf("%d",a[i]+j);
m=<<w;
for (int i=;i<m;i++) I.t[i][i]=;
for (int i=;i<m;i++)
for (int j=;j<m;j++)
d.t[i][j]=check(i,j);
cout<<(d^n+).t[][]<<endl;
return ;
}

T3:[TJOI2015]概率论

这个嘛。。。先贴下官方题解吧

好复杂对吧,我们打个表 。。。

f[1]=1/1,f[2]=3/3,f[3]=6/5,f[4]=10/7 ...

找到了吧 f[n]=n*(n+1)/2/(2n-1)。

完了。。。

CODE:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int n;
scanf("%d",&n);
printf("%.9lf\n",n*1ll*(n+)/*1.0/(*n-));
return ;
}

话说BZ 350道题了。。。其实这一年几乎都在学校的oj上刷,能在这1年的时间刷多了100道题也挺自豪的。。。想想自己100时的那种兴奋,还是觉得自己挺弱智的。。。

还有3个小时就是自己的17岁生日了,回想自己的第16个年头,还是挺满意的,至少自己坚持了自己的路。在这里祝自己生日快乐,在接下来的一年里会接受越来越大的挑战,或者省队都进不了直接滚粗,或者noi胸牌滚粗,又或者侥幸成为了进队爷。。。不管自己今后咋样,希望能不忘本心吧,自己选择的路,就算跪着也要走完。

距GDOI还有4天,明天就是最后的一场模拟赛了,自己却感觉还总是找不到感觉,真的不想再发生像NOIP还有GDKOI时那黑暗的第二天了。。。自己真的很想被人敬仰膜拜一番,加油吧,再认真仔细一点吧。

以后的路会怎样,就跟我现在在听的歌一样吧。God knows,只有上帝才会知道,我们现在所能做的,只有认真过好每一分每一秒了

GDOI,God Bless!!!

TJOI2015 day2解题报告的更多相关文章

  1. GX/GZOI2019 day2 解题报告

    GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(i)= ...

  2. 【NOIP2015】提高day2解题报告

    题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...

  3. 【未完成0.0】Noip2012提高组day2 解题报告

    第一次写一套题的解题报告,感觉会比较长.(更新中Loading....):) 题目: 第一题:同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一 ...

  4. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  5. 常州培训 day2 解题报告

    第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大 ...

  6. TJOI2015 day1解题报告

    博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= = T1:[TJOI2015]线性代数 描述:戳上面吧= = 首先这道题我觉得是这套题最漂亮的一道题了(虽然说学 ...

  7. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  8. NOIP2018提高组Day2 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). \(Day2\)的题目和\(Day1\)比起来,真的是难了很多啊. \(T1\):旅行(点此看 ...

  9. CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

    T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...

随机推荐

  1. nodejs抓取数据二(列表解析)

    这里做得比较暴力,没有分页取出数据解析,O(∩_∩)O哈哈~,居然没有被挂机.不过解析的坑特别多...不过大部分我想要的数据都拿到了. //解析列表数据 var http = require(&quo ...

  2. 博客停更及OI退役公告

    停更&&OI退役 公告 高中OI之路就这样结束了,曾经想过回在NOI跪,APIO跪,HNOI跪却从未想过会在NOIP跪! 没办法自己作死啊,CCF感觉还是很良心的混个省一回来了,看以后 ...

  3. 使用 System.Transactions 进行事物管理

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. UVa 341 - Non-Stop Travel

    题目大意:给一个地区的地图,上面有若干路口,每个路口因为红灯的缘故要耽误一些时间,给出起点和终点,找出最短路径使得耽误时间最短. 单源最短路问题,Dijkstra算法.同时还要打印路径. #inclu ...

  5. Leetcode 181. Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  6. 基于arm开发板四个按键控制四个灯亮

    基于s5pv2410,cortex a8的四个按键每一个按键点了对应的灯 对于用汇编来编程的话不难,重点在于数据手册,电路图,管脚的看懂 直接上代码 .globl _start_start: ldr ...

  7. Java 之 web.xml(Java之负基础实战)

    多个web.xml会同时生效,先加载tomcat下的web.xml,再加载网站目录下的web.xml. 1.tomcat自带的web.xml 在tomcat的conf目录下 2.自定义web.xml ...

  8. 在 AngularJS 中将 XML 转换为 JSON

    在这篇文章中,我们将谈谈如何在Angular JS中将XML文件转换为JSON.大家都知道Angular JS是开发应用程序的JavaScript框架.所以基本上Angular  JS期望得 到的响应 ...

  9. iOS 登陆之界面设置

    1.界面构成 1.1. 效果图 1.2. 元素 背景图 用户名的输入框 密码的输入框 登陆按钮 忘记密码 用户注册 第三方登陆 两个分割线

  10. Java div 使用说明

    1. 置于底部 position:absolute; bottom:0;