CSU 1913: 一條大笨龍送禮物 1914: John and his party 1915: John and his farm 1917: There is no SSR
#include <cstdio>
#include <cstring>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
const int MAXN = 1e5 + 5;
const int SIZE = 2e5 + 5;
int Sum[MAXN * 3], Col[MAXN * 3];
int a[MAXN];
int n, m, k;
struct o {
int l, r;
} O[MAXN];
void push_up(int rt) {
Sum[rt] = Sum[rt << 1] + Sum[rt << 1 | 1];
}
void push_down(int rt, int m) {
if(Col[rt] != -1) {
Col[rt << 1] = Col[rt << 1 | 1] = Col[rt];
Sum[rt << 1] = (m - (m > > 1)) * Col[rt];
Sum[rt << 1 | 1] = (m >> 1) * Col[rt];
Col[rt] = -1;
}
}
void build(int lowv, int l, int r, int rt) {
Col[rt] = -1;
Sum[rt] = 0;
if(l == r) {
Sum[rt] = a[l] > lowv;
return;
}
int mid = (l + r) >> 1;
build(lowv, lson);
build(lowv, rson);
push_up(rt);
}
void update(int L, int R, int v, int l, int r, int rt) {
if(L > R) return;
if(L <= l && r <= R) {
Sum[rt] = (r - l + 1) * v;
Col[rt] = v;
return ;
}
push_down(rt, r - l + 1);
int mid = (l + r) >> 1;
if(L <= mid) update(L, R, v, lson);
if (R > mid) update(L, R, v, rson);
push_up(rt);
}
int query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
return Sum[rt];
}
int mid = (l + r) >> 1;
push_down(rt, r - l + 1);
int ret = 0;
if(L <= mid) ret += query(L, R, lson);
if(R > mid) ret += query(L, R, rson);
return ret;
}
bool C(int mid, int len) {
build(mid, 1, n, 1);
for(int i = 0; i < len; i ++) {
int s1 = query(O[i].l, O[i].r, 1, n, 1);
int s0 = O[i].r - O[i].l + 1 - s1;
int cz = (s1 & 1) == 1;
int qlk = s1 / 2;
update(O[i].l, O[i].l + qlk - 1 + cz, 1, 1, n, 1);
update(O[i].l + qlk + cz, O[i].r - qlk, 0, 1, n, 1);
update(O[i].r - qlk + 1, O[i].r, 1, 1, n, 1);
}
return query(k, k, 1, n, 1) == 0;
}
int main() {
while(~scanf("%d%d%d", &n, &m, &k)) {
for(int i = 1; i <= n; i ++) {
scanf("%d", &a[i]);
}
int op, len = 0, zl;
for(int i = 1; i <= m; i ++) {
scanf("%d", &op);
if(op == 1) {
scanf("%d%d", &O[len].l, &O[len].r);
len ++;
} else {
scanf("%d", &zl);
len -= zl;
len = len < 0 ? 0 : len;
}
}
//printf("[%d]\n", len);
int lb = 0, ub = SIZE;
while(ub - lb > 1) {
int mid = (ub + lb) >> 1;
if(C(mid, len)) ub = mid;
else lb = mid;
}
printf("%d\n", ub);
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<sstream>
#include<vector>
#include<cmath>
#define LL long long
#define md int mid = (L+R)>>1
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int maxn = 2e5+50000;
int id[maxn<<2],mx[maxn<<2];
int n;
int ans[maxn];
int lazy[maxn<<2];
void push_up(int rt)
{
if(mx[ls]>=mx[rs])
id[rt] = id[ls];
else
id[rt] = id[rs];
mx[rt] = max(mx[ls],mx[rs]);
}
void push_down(int rt)
{
if(lazy[rt])
{
lazy[ls] += lazy[rt];
lazy[rs] += lazy[rt];
mx[ls] += lazy[rt];
mx[rs] += lazy[rt];
lazy[rt] = 0;
}
}
void build(int L,int R,int rt)
{
if(L==R)
{
id[rt] = L;
mx[rt] = -L;
return ;
}
md;
build(L,mid,ls);
build(mid+1,R,rs);
push_up(rt);
}
void update(int l,int r,int L,int R,int rt)
{
// cout<<"diap"<<endl;
if(l<=L&&R<=r)
{
lazy[rt]++;
mx[rt]++;
return ;
}
push_down(rt);
md;
if(l<=mid)
update(l,r,L,mid,ls);
if(r>mid)
update(l,r,mid+1,R,rs);
push_up(rt);
}
void change(int p,int L,int R,int rt)
{
if(L==R)
{
mx[rt] = -0x3f3f3f3f;
// id[rt] = L;
return ;
}
md;
push_down(rt);
if(mid>=p)
change(p,L,mid,ls);
else
change(p,mid+1,R,rs);
push_up(rt);
}
int main()
{
while(~scanf("%d",&n))
{
memset(ans,-1,sizeof(ans));
build(1,n,1);
memset(lazy,0,sizeof(lazy));
for(int i = 0 ;i < n;i++)
{
int op,x;
scanf("%d%d",&op,&x);
if(!op)
{
//cout<<"fuck"<<endl;
update(1,x,1,n,1);
//cout<<"gan"<<endl;
}
else
update(x,n,1,n,1);
if(mx[1]<0)
continue;
while(!mx[1])
{
ans[id[1]] = i+1;
change(id[1],1,n,1);
}
}
for(int i = 1;i <= n;i++ )
printf("%d%c",ans[i],i==n?'\n':' ');
}
return 0;
}
#include <queue>
#include <stack>
#include <ctime>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef long double LB;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
void debug() { cout << endl; }
template<typename T, typename ...R> void debug (T f, R ...r) { cout << "[" << f << "]"; debug (r...); }
const int MAXN = 1e5 + 5;
const int MAXM = 20;
int n, m;
struct Edge {
int v, next;
} edge[MAXN << 1];
int head[MAXN], tot;
int dep[MAXN], siz[MAXN], fa[MAXN][MAXM];
LL all[MAXN], sum[MAXN];
int root;
void init_edge() {
tot = 0;
memset(head, -1, sizeof(head));
}
inline void add_edge(int u, int v) {
edge[tot] = Edge {v, head[u]};
head[u] = tot ++;
}
void dfs(int u, int pre, int d) {
int v;
siz[u] = 1;
dep[u] = d;
sum[u] = 0;
fa[u][0] = pre;
for(int i = head[u]; ~i; i = edge[i].next) {
v = edge[i].v;
if(v == pre) continue;
dfs(v, u, d + 1);
siz[u] += siz[v];
sum[u] += sum[v];
sum[u] += siz[v];
}
}
void dfs2(int u, int pre) {
int v;
for(int i = head[u]; ~i; i = edge[i].next) {
v = edge[i].v;
if(v == pre) continue;
all[v] = all[u] + (n - 1 - siz[v]) - (siz[v] - 1);
dfs2(v, u);
}
}
void lca_init() {
for(int j = 1; j < MAXM; ++j) {
for(int i = 1; i <= n; ++i) {
fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
}
}
int lca(int u, int v) {
while(dep[u] != dep[v]) {
if(dep[u] < dep[v]) swap(u, v);
int d = dep[u] - dep[v];
for(int i = 0; i < MAXM; i++) {
if(d >> i & 1) u = fa[u][i];
}
}
if(u == v) return u;
for(int i = MAXM - 1; i >= 0; i--) {
if(fa[u][i] != fa[v][i]) {
u = fa[u][i];
v = fa[v][i];
}
}
return fa[u][0];
}
int son(int u, int v) {
while(dep[v] > dep[u] + 1) {
int w = v;
for(int j = 0; j < MAXM; ++j) {
if(dep[fa[v][j]] < dep[u] + 1) break;
w = fa[v][j];
}
v = w;
}
return v;
}
int main() {
int u, v, w;
while(~scanf("%d %d", &n, &m)) {
init_edge();
for(int i = 1; i <= n - 1; ++i) {
scanf("%d %d", &u, &v);
add_edge(u, v);
add_edge(v, u);
}
dfs(root = 1, 0, 0);
all[root] = sum[root];
dfs2(root, 0);
lca_init();
while(m --) {
scanf("%d %d", &u, &v);
if(dep[u] > dep[v]) swap(u, v);
w = lca(u, v);
int dist, sizu, sizv;
LL sumu, sumv;
double ans;
if(w != u) {
/** 有lca **/
dist = dep[u] + dep[v] - 2 * dep[w];
sizu = siz[u];
sumu = sum[u];
sizv = siz[v];
sumv = sum[v];
} else {
/**一條鏈**/
dist = dep[v] - dep[u];
w = son(u, v);
sizu = n - siz[w];
sumu = all[u] - sum[w] - siz[w];
sizv = siz[v];
sumv = sum[v];
}
ans = 1.0 + dist + 1.0 * ((LL)sizu * sumv + (LL)sizv * sumu) / ((LL)sizu * sizv);
printf("%.8f\n", ans);
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=105;
struct Matrix{
int n;
double m[maxn][maxn];
void init(int sz){
n=sz;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
m[i][j]=0;
}
Matrix(int sz){init(sz);}
void set_I(){
for(int i=0;i<n;i++) m[i][i]=1.0;
}
Matrix operator* (const Matrix& a){
Matrix ans(n);
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
ans.m[i][j]+=m[i][k]*a.m[k][j];
}
return ans;
}
};
int main(){
double p,q;
int n,m;
while(scanf("%lf%lf%d%d",&p,&q,&n,&m)!=EOF){
Matrix base(n),ans(n);
for(int i=0;i<n;i++) base.m[i][0]=p*pow(q,i);
for(int i=0;i<n-1;i++) base.m[i][i+1]=1.0;
ans.m[0][0]=1-pow(q,n);
for(int i=1;i<n;i++) ans.m[0][i]=1;
m=m-n;
while(m){
if(m&1) ans=ans*base;
m>>=1;
base=base*base;
}
printf("%.6lf\n",1-ans.m[0][0]);
}
}
相關推薦
CSU 1913: 一條大笨龍送禮物 1914: John and his party 1915: John and his farm 1917: There is no SSR
#include <cstdio> #include <cstring> #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 using name
SSM框架報錯分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'
一、發現問題 <select id="queryStudentByNum" resultType="student" parameterType="string"> select num,name,phone from student <where> <if t
解決The goal you specified requires a project to execute but there is no POM in this directory錯誤的一種方法!
在使用Jenkins自動構建Java專案時,出現以下的錯誤。錯誤日誌如下: + /opt/maven/apache-maven-3.5.4/bin/mvn clean package -U -e -B -Dmaven.test.skip=true [INFO] Error
binary-tree-maximum-path-sum——二叉樹任意一條路徑上的最大值
binary 遞歸 nod 父節點 遍歷 color find start node Given a binary tree, find the maximum path sum. The path may start and end at any node in the
hdu4240 求一條流量最大的路/(此題網上百分之90以上算法是錯誤的)
沒有想到 答案 blog main sin amp init 網上 ans 題意:求最大流/一條流量最大的路的流量。(此題HDU上數據水,以下倆種錯誤的都能過。。。。) 思路1;每次增廣的時候更新流量,保存最大的那條。 錯誤性:每次更新。有可能最大的那條流量是前
曲子龍:搞人工智能不如養一條好狗!
人工智能 原計劃更新《相比其它詐騙,區塊鏈ICO到底牛在哪?》,但裏面有很多內容有一些比較深的名詞可能不容易理解,於是我優先更新這篇文章,文中有很多內容與下一篇都有關聯,建立我最近的幾篇內容連起來閱讀,可能會更容易理解。 文章會有很多爭議,看不懂的話可以適當多理解幾次,或者與我互動,若覺得與主流“專家”分享觀
區塊鏈技術開發兩大路徑 哪一條才是商用坦途?
color 通用 均值 經理 交易 訪問 現狀 能力 -a 區塊鏈技術開發被各大媒體貶褒至今,已有些許沈澱。而2018年是區塊鏈的一個應用風口,各大企業、初創者紛紛爆出自己的區塊鏈項目消息,一時間群雄並起引來無數關註。就目前全球的區塊鏈路徑而言只有兩種。一、公有鏈公有鏈是一
安卓Notification 推送多條只顯示一條問題
轉載請註明出處 http://blog.csdn.net/qq_31715429/article/details/50978587 本文出自:猴菇先生的部落格 (1).推送多條手機全能接收,但是隻顯示一條通知,後一條會頂掉前一條,最後只顯示一條最新的notifica
MySQL刪除重複資料,只保留其中最大id的一條
今天同事寫了個刪除重複資料保留一條記錄的資料庫語句,問我錯在哪兒,正好給大家講講【注:以下語句只單對MYSQL資料庫】 語句 -- 問題: delete from `show` where id not in ( select MAX(id)
如何學習大資料?首先你需要一條這樣的大資料學習路線
最近很多人問我現在學習大資料這麼多,他們都是如何學習的呢。很多初學者在萌生向大資料方向發展的想法之後,不免產生一些疑問,應該怎樣入門?應該學習哪些技術?學習路線又是什麼?今天小編特意為大家整理了一份大資料從入門到精通的學習路線。並且附帶學習資料和視訊。希望能夠幫助到大家。 第一階段:Lin
在mysql 中查詢時間最大的一條記錄
首先如下這樣寫是錯的: SELECT name,MAX(last_updated) FROM digital_asset GROUP BY name; 這樣子查到的資料last_updated確實是最大的,但是和name沒有關係; 用這個方法可以實現: SELECT A.* F
面試了一名32歲的程式設計師,領導:年紀太大,直接送走吧
程式設計師是吃青春飯的行業嗎?這個問題放在國內,很多人都會表示認同,君不見,很多網際網路企業招聘程式設計師,年紀三十多歲的一般就不考慮了,比如華為,前段時間就盛傳清退35歲以上的員工,雖然沒有得到官方證實,但空穴不來風。華為好歹設了一個35歲的標準,可是近日一名網友的爆料卻讓
【綜述篇】鵝廠大劇拉開帷幕,“一條河”、“兩張網”……等等!還有啥?
我是一條河 流經時間與空間 連線永珍與未來 …… 走進猶如梵高畫作般的劇院,開場一部官宣主題片《河流》將騰訊二十年始終未變的“連線力”以及“行萬里、利萬物”的理念展現給世人,這就是此時此刻正在上演的鵝廠大劇——2018騰訊合作伙伴大會! 在南京,我們是觀眾;未來
【DP】在矩陣中,選擇一條從左上角到右下角、經過數字之和最大的路徑
題目:EPI int max_fishing(vector<vector<int>> A) { if (A.empty() || A[0].empty()) throw new exception; for (int i = 0; i &l
微信裡面的簽到加積分介面(已經測試過沒問題)服務號不能每天傳送訊息,為了避免這個,每天簽到的時候,推送一條最新的訊息給客戶。
public string QianDao(string WeiXinId, string key)//引數是微訊號 { strs = WeiXinId.Trim() + "WJXFGCLN+Mihaha";
求某列最大值資料對應的那一條資料
最近設計一個事務處理,遇到一個Sql語句怎麼都寫不出啦,試了很多次才實現,因此在此記錄分享一下。 業務是這樣的:求書的表中的價格最高的那本書的詳細資訊; 表books中有三個欄位,isbn,boo
Sql Server exists 查詢相同姓名或編號 年份最大的一條資料
select code,zw,zj,year from ZW a where not exists(select 1 from ZW where code=a.code and year>a.year) 對ZW表進行掃描,編號(或姓名)相同情況下,沒有比前邊年份大的資
SQL針對單列刪除重複資料只保留一條id最大的資料
delete from t_student where id in ( SELECT id from (SELECT * from t_student where name in (select name from t_student where name i
sql 查詢相同記錄下日期最大的 一條
create table cangku ( F_RQ datetime, F_BH VARCHAR(20), F_SL FLOAT )INSERT INTO cangku VALUES('2012-05-31','C001',343) INSERT INTO cangku VALUES('2012-05-30
MySQL語句:獲取最後一條記錄(ID數值最大的) - - Java EE
使用升序排序,將ID數值最大的放到最頂部。並顯示出來。 order by % desc 表示按降序排序 在sql語句的最後加上 limit 0,1 只取第一條記錄 select * from 表名 order by 表中ID欄位名稱 desc limit 0,1;