예제 #1
0
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());

            for (int tc = 1; tc <= T; tc++)
            {
                n = int.Parse(Console.ReadLine());
                a = new node[n + 1];
                string[] data = Console.ReadLine().Split();

                for (int i = 1; i <= n; i++)
                {
                    a[i].num   = int.Parse(data[i - 1]);
                    a[i].index = i;
                }

                int          len = compress();
                Fenwick_Tree ft  = new Fenwick_Tree(len);

                int ans = 0;
                for (int i = 1; i <= n; i++)
                {
                    int freq = ft.query(a[i].idx - 1);
                    ans = (ans + freq + 1) % MOD;
                    ft.update(a[i].idx, freq + 1);
                }
                Console.WriteLine("Case {0}: {1}", tc, ans);
            }
        }
예제 #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            bool b = false;

            foreach (char c in t.Text)
            {
                if (!char.IsDigit(c) && c != ' ')
                {
                    b = true;
                    break;
                }
            }
            if (t.Text == "" || b)
            {
                MessageBox.Show("Error!");
            }
            else
            {
                string[] ss = t.Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                int[]    a  = new int[ss.Length];
                int      i  = 0;
                foreach (string s in ss)
                {
                    if (!int.TryParse(s, out a[i]))
                    {
                        MessageBox.Show("Error!");
                    }
                    i++;
                }
                f = new Fenwick_Tree(a);

                Ref();
            }
        }
예제 #3
0
        static void Main(string[] args)
        {
            int    T = int.Parse(Console.ReadLine());
            string bits;

            for (int tc = 1; tc <= T; tc++)
            {
                bits = Console.ReadLine();
                Fenwick_Tree ft = new Fenwick_Tree(bits.Length);

                Console.WriteLine("Case {0}:", tc);
                int q = int.Parse(Console.ReadLine());
                for (int i = 0; i < q; i++)
                {
                    string[] data = Console.ReadLine().Split();
                    if (data[0] == "I")
                    {
                        int l = int.Parse(data[1]);
                        int r = int.Parse(data[2]);
                        ft.update(l, r, 1);
                    }
                    else
                    {
                        int pos = int.Parse(data[1]);
                        int bit = int.Parse(bits[pos - 1].ToString());
                        Console.WriteLine(bit ^ ft.query(pos));
                    }
                }
            }
        }
예제 #4
0
        public void test_count_prop_bad()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(false, ft.Count == ft.Count + 1);
        }
예제 #5
0
        public void test_range_read_bad_data()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(false, ft.range_read(ft, 2, 4) == 8);
        }
예제 #6
0
        public void test_count_prop_good()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(arr_input.GetLength(0), ft.Count);
        }
예제 #7
0
        public void test_read_good_data()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(6, ft.read(3));
        }
예제 #8
0
        public void test_actual_param_good(int idx, int expected)
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(expected, ft.actual(idx));
        }
예제 #9
0
        public void test_actual_bad_data()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            Assert.AreEqual(false, ft.actual(3) == 4);
        }
예제 #10
0
        static void Main(string[] args)
        {
            string[] data = Console.ReadLine().Split();
            int      N    = int.Parse(data[0]);
            int      U    = int.Parse(data[1]);
            int      Q    = int.Parse(data[2]);

            Fenwick_Tree ft = new Fenwick_Tree(N);

            for (int i = 0; i < U + Q; i++)
            {
                data = Console.ReadLine().Split();
                int op = int.Parse(data[0]);
                int u  = int.Parse(data[1]);
                int v  = int.Parse(data[2]);

                if (op == 1)
                {
                    ft.update(u, 2 * v);
                    if (u != 1)
                    {
                        ft.update(u - 1, v);
                    }
                    if (u != N)
                    {
                        ft.update(u + 1, v);
                    }
                }
                else
                {
                    Console.WriteLine(ft.query(u, v));
                }
            }
        }
예제 #11
0
        public void test_update()
        {
            int[]        arr_input = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            Fenwick_Tree ft        = new Fenwick_Tree(arr_input);

            ft.update(4, 26);
            Assert.AreEqual(30, ft.actual(4));
        }
예제 #12
0
        static void Main(string[] args)
        {
            string[] data = Console.ReadLine().Split();
            n = int.Parse(data[0]);
            K = int.Parse(data[1]);

            a = new node[n];
            for (int i = 0; i < n; i++)
            {
                a[i].num   = int.Parse(Console.ReadLine());
                a[i].index = i;
            }

            int len = compress();

            Fenwick_Tree[] f = new Fenwick_Tree[K + 1];
            for (int i = 0; i <= K; ++i)
            {
                f[i] = new Fenwick_Tree(len);
            }

            int ans = 0;

            for (int i = 0; i < n; ++i)
            {
                for (int k = 1; k <= K; ++k)
                {
                    int val;
                    if (k - 1 == 0)
                    {
                        val = 1;
                    }
                    else
                    {
                        val = f[k - 1].query(a[i].idx - 1);
                    }

                    f[k].update(a[i].idx, val);

                    if (k == K)
                    {
                        ans = (ans + val) % MOD;
                    }
                }
            }
            Console.WriteLine(ans);
        }
예제 #13
0
        static void Main(string[] args)
        {
            int T = int.Parse(Console.ReadLine());

            string[] data;
            int      n, q;

            for (int tc = 1; tc <= T; tc++)
            {
                data = Console.ReadLine().Split();
                n    = int.Parse(data[0]);
                q    = int.Parse(data[1]);

                Fenwick_Tree ft = new Fenwick_Tree(n);

                data = Console.ReadLine().Split();
                for (int i = 1; i <= n; i++)
                {
                    ft.update(i, int.Parse(data[i - 1]));
                }

                Console.WriteLine("Case {0}:", tc);
                for (int i = 0; i < q; i++)
                {
                    data = Console.ReadLine().Split();
                    if (data[0] == "1")
                    {
                        int pos  = int.Parse(data[1]) + 1;
                        int sack = ft.query(pos, pos);
                        ft.update(pos, -sack);
                        Console.WriteLine(sack);
                    }
                    else if (data[0] == "2")
                    {
                        int pos = int.Parse(data[1]) + 1;
                        int val = int.Parse(data[2]);
                        ft.update(pos, val);
                    }
                    else
                    {
                        int l = int.Parse(data[1]) + 1;
                        int r = int.Parse(data[2]) + 1;
                        Console.WriteLine(ft.query(l, r));
                    }
                }
            }
        }
예제 #14
0
        static void Main(string[] args)
        {
            int t = int.Parse(Console.ReadLine());
            while (t-- > 0)
            {
                n = int.Parse(Console.ReadLine());
                a = new node[n];
                string[] data = Console.ReadLine().Split();

                for (int i = 0; i < n; i++)
                {
                    a[i].num = int.Parse(data[i]);
                    a[i].index = i;
                }

                int len = compress();
                Fenwick_Tree even = new Fenwick_Tree(len);
                Fenwick_Tree odd = new Fenwick_Tree(len);


                int ans = 0;
                for (int i = 0; i < n; i++)
                {
                    int par = even.query(a[i].idx - 1);
                    int imp = odd.query(a[i].idx - 1);

                    if (a[i].num % 2 == 0)
                    {
                        ans = (ans + imp) % MOD;
                        even.update(a[i].idx, par + 1);
                        odd.update(a[i].idx, imp);
                    }
                    else
                    {
                        ans = (ans + par + 1) % MOD;
                        even.update(a[i].idx, imp);
                        odd.update(a[i].idx, par + 1);
                    }
                }
                Console.WriteLine(ans);
            }
        }